第一题:
小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。
魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币
小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。
解题思路:
看到2x+1 和 2x+2 ,这两个式子之后很明显就可以知道一个可以得到奇数一个可以得到偶数。但是如何知道从0 开始,先使用哪个魔法机器呢?
既然从前面不知道怎么向后推算,那就直接利用结果n 向前推算吧!还是没有什么思路,当然需要用笔画一画了。
稍微一画,立马就有思路了!如果令n%2==0,那么到达n这一步则需要通过魔法机器2,如果!=0 那么则是通过魔法机器1。然后设置好限制条件,就很容易的能够将路径倒序的装入数组中。最后,在倒过来打印就能够知道应该怎么选择魔法机器了!
示例代码:
#include"stdio.h" int main() { int array[10]; //倒叙记录每次选择的魔法机器 int n,i = 0,length = 0; scanf("%d",&n); while(n>0){ length = i; if(n%2==0){ n = n/2-1; array[i] = 2; }else{ n = n/2; array[i] = 1; } i++; } for(i = length; i >= 0; i--){ printf("%d",array[i]); } return 0; }
第二题:
为了得到一个数的"相反数",我们将这个数的数字顺序颠倒,然后再加上原先的数得到"相反数"。例如,为了得到1325的"相反数",首先我们将该数的数字顺序颠倒,我们得到5231,之后再加上原先的数,我们得到5231+1325=6556.如果颠倒之后的数字有前缀零,前缀零将会被忽略。例如n = 100, 颠倒之后是1.
解题思路:
我一般写代码前都会先在纸上写出大致思路,然后就直接写代码,接着调试!看到这个题和以前课上老师布置的一个作业挺像,只不过作业仅仅要求将一个数字反过来其实还都是一样!用n%10 取余数,用数组记录下来。当然在模10之前应该先把最后的所有0 过滤掉!(也不用多说了,上代码!)
示例代码:
#include"stdio.h" int main(){ int n,m = 0; //n为输入的数字,m为反转过来的数字 int jinzhi=1; int length = 0; int arrayM[10]; //存放被拆开的数字 scanf("%d",&n); int l = n; //记录n的值,最后用到 while(n%10==0) //将n 后面所有的0过滤掉 n=n/10; while(n>0){ //拆数 arrayM[length] = (n%10); length++; n = n/10; } for(int i = 0;i<length;i++){ //将数字组装起来 jinzhi = 1; for(int j = 1;j<length-i;j++) jinzhi = jinzhi*10; m = arrayM[i]*jinzhi+m; } printf("%d ",m+l); //输出两数字之和 return 0; }
第三题:
一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,"aaabbaaac"是由下面碎片组成的:'aaa','bb','c'。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的平均长度是多少。
解题思路:
首先明确一下,碎片最短为1,最少存在一个碎片。设置一个游标,从左向右遍历字符串(用到while循环结构)。然后判断当前字符和下一个字符是否相等,如果相等则当前碎片的长度加一,游标移向下一个进入下一次循环。如果不相等,则开始重新记录一个碎片,游标移向下一个进入下一次循环。
示例代码:
#include"stdio.h" int main(){ int length[50];//分别存放每一个碎片的长度,最大为50 char str[50]; //存放待检查的字符串 int number=1; //记录碎片的数量 double avglength; int j=0; //每个碎片长度最少为1 for(int i=0;i<50;i++) length[i] = 1; scanf("%s",str); while(str[j]!=' '){ if(str[j]==str[j+1]){ length[number-1]++; } else{ number++;//碎片数量加一 } j++; //游标移向下一个字符 } int sum = 0; int num=number-1; for(int i=0;i<num;i++) sum = sum+length[i]; avglength = sum/(num*1.0); printf("%.2f",avglength); return 0; }
未完待续... ...