PTA1016 部分a+b

题目

 分析: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的方法是可以记忆下来,并在以后设计中继续使用的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值