整出光棍

描述:

这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。

提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。

输入格式:

输入在一行中给出一个不以5结尾的正奇数x(<1000)。

输出格式:

在一行中输出相应的最小的sn,其间以1个空格分隔。

输入样例:

31

输出样例:

3584229390681 15

代码:

#include"stdio.h"
#include"string.h"
main()
{
//  使用除法计算过程,若当前的光棍数不能被N整除,
//  那么增加一位,将其余数*10+1继续除,直到能够整除
    int x,p = 1, z = 1;
    scanf("%d",&x);
    while(p<x){
        p = p*10 + 1;
        z++;
    }
    while(p%x!=0){
        printf("%d",p/x);
        p = p%x;
        p = p*10+1;
        z++;
    }
    printf("%d %d",p/x,z);
}

解析:

由于数据过大,超过了long long的2的32次方-1。所以使用模拟除法的方式,先找到比输入数据大的光棍数,不然后面的除法没法进行,并计算位数。然后进入循环,由于如果前几位不变,后几位再怎么增加,最开始得到的商都是相同的,所以每次将商输出出来,并得到余数,另余数再次乘10加1,代表增加一位1。当可以整除时,退出循环,最后输出最后的商和位数。

敲笨钟

描述:

微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”(chong)和“弓”(gong)都压了“ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。

现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。

输入格式:

输入首先在第一行给出一个不超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 , 分隔,句号 . 结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。

输出格式:

对每一行诗句,判断其是否压“ong”韵。即上下两句末尾的字都是“ong”结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped,即跳过此句。

输入样例:

5
xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong.
tian sheng wo cai bi you yong, qian jin san jin huan fu lai.
xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long.
zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong.
ren xian gui hua luo, ye jing chun shan kong.

输出样例:

xun zhang zhai ju lao diao chong, xiao yue dang lian qiao ben zhong.
Skipped
xue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong.
Skipped
Skipped

代码:

#include<stdio.h>
#include<string.h>
int main(){
    int n;
    scanf("%d",&n);
    getchar();
    for(int i=0;i<n;i++){
        char s[105];
        char str[100][10];
        gets(s);
        char *p;
        int len = 0;
        int flag = 0;
        p = strtok(s," ");
        while(p){
            strcpy(str[len],p);
            if(p[strlen(p)-1]==','){
                if(p[strlen(p)-2]=='g'&&p[strlen(p)-3]=='n'&&p[strlen(p)-4]=='o'){
                    flag+=1;
                }
                else{
                    break;
                }
            }
            else    if(p[strlen(p)-1]=='.'){
                if(p[strlen(p)-2]=='g'&&p[strlen(p)-3]=='n'&&p[strlen(p)-4]=='o'){
                    flag+=1;
                }
                else{
                    break;
                }
            }
            len++;
            p = strtok(NULL," ");
        }
        if(flag==2){
            for(int i=0;i<len-3;i++){
                printf("%s ",str[i]);
            }
            printf("qiao ben zhong.\n");
        }
        else{
            printf("Skipped\n");
        }
    }
    return 0;
} 

解析:

思路非常简单,将字符串拆分后,将每一个词都存入二位字符串数组,前半句的最后一个字符串判断是否符合“ong”的条件,若符合则flag+1,代表一个符合,后半句的最后一个字符串是否符合“ong”条件。若两个都符合则输出这句话,输出到倒数第三个时停止,输出“qiao ben zhong.”

不满足条件的直接输出“SKipped”。


一只小菜鸡