题目
分析:P 由 D 在 A 中出现的次数得到,计算加和很简单。那关键就在于统计D出现的次数,以及 通过这个次数得到P
代码设计
1.统计次数。由题数字范围太大了,定义一个数组储存不实惠。于是我想到用getchar函数把一串数当作字符串来读取,并与ASCII码值比对,进而统计字符的个数。
while((check=getchar())!=' ')//统计每个数字出现的次数
{
switch(check)
{
case 48:a++;break;
case 49:b++;break;
case 50:c++;break;
case 51:d++;break;
case 52:e++;break;
case 53:f++;break;
case 54:g++;break;
case 55:h++;break;
case 56:i++;break;
case 57:j++;break;
}
}
2.通过次数转译出P。
我这里先用max和pct计算出P的最大位数,然后再通过pctt(pct的副本)和max=max/10来计算出P。(自认为是比较简便的方法)
canf("%d",&D);
int P=0,pct,pctt,max=1; // max表示最大位数
switch(D)//找到 D 对应的次数
{
case 0:pct=a;break;
case 1:pct=b;break;
case 2:pct=c;break;
case 3:pct=d;break;
case 4:pct=e;break;
case 5:pct=f;break;
case 6:pct=g;break;
case 7:pct=h;break;
case 8:pct=i;break;
case 9:pct=j;break;
}
pctt=pct;
for(;pct>1;pct--)
max=10*max;
if(pctt==0) P=0; //这里max有两种方法为1
else{ //若P为1位数,max等于1,合理
for(;max>=1;pctt--)//但若P=0,max等于1,不合理
{ //因此这里用pctt作pct的副本,来判断p是否为0
P=P+D*max;
max=max/10;
}
这里还要注意,若不加pctt的限制条件,则如注释所说max有两种方法为1,这是不合理的。
我第一次写的时候就没注意。
3.通过for语句循环一次上述代码,并计算加和。
有两点需要注意。
1.由于输入时,是数字+空格的形式。第一次循环后缓冲区里剩下的是 空格+数字 所以需要一个getchar函数把空格读取掉再继续下一次循环
2.初始化变量。a,b,c,d....要初始化为0。max要初始化为1。
sum=sum+P;
getchar();//从缓冲区读取一个空格,
a=b=c=d=e=f=i=j=0;
}
整体展示
#include<stdio.h>
int main()
{
int a, b, c, d, e, f, g, h, i, j;//0 1 2 3 4 5 6 7 8 9
a=b=c=d=e=f=i=j=0;
int check,D,frequency=0,sum=0;
for(;frequency<2;frequency++)
{
while((check=getchar())!=' ')//统计每个数字出现的次数
{
switch(check)
{
case 48:a++;break;
case 49:b++;break;
case 50:c++;break;
case 51:d++;break;
case 52:e++;break;
case 53:f++;break;
case 54:g++;break;
case 55:h++;break;
case 56:i++;break;
case 57:j++;break;
}
}
scanf("%d",&D);
int P=0,pct,pctt,max=1; // max表示最大位数
switch(D)//找到 D 对应的次数
{
case 0:pct=a;break;
case 1:pct=b;break;
case 2:pct=c;break;
case 3:pct=d;break;
case 4:pct=e;break;
case 5:pct=f;break;
case 6:pct=g;break;
case 7:pct=h;break;
case 8:pct=i;break;
case 9:pct=j;break;
}
pctt=pct;
for(;pct>1;pct--)
max=10*max;
if(pctt==0) P=0; //这里max有两种方法为1
else{ //若P为1位数,max等于1,合理
for(;max>=1;pctt--)//但若P=0,max等于1,不合理
{ //因此这里用pctt作pct的副本,来判断p是否为0
P=P+D*max;
max=max/10;
}
sum=sum+P;
getchar();//从缓冲区读取一个空格,
a=b=c=d=e=f=i=j=0;
}
}
printf("%d",sum);
}
个人总结
1.确定P的方法是可以记忆下来,并在以后设计中继续使用的。