经典例题-个位数统计

  1. 前言
  2. 正文

前言

2019.6.7更新:我觉得我之前写的是纯垃圾代码,不过这个不能怪我,我那个时候还没接受正规的训练,代码屎非常正常。得到的教训是,时常重构代码可以有效提高代码质量。

下面是我3分钟写的新版个位数统计

#include <stdio.h>
int main(){
    char a[1000];
    int  num[10]={};
    scanf("%s",a);
    for(char *p=a;*p!='\0';p++){//Bitmap
        num[*p-'0']++;
    }
    for(int i=0;i<10;i++){
        if(num[i])
            printf("%d:%d\n",i,num[i]);
    } 
}

正文

简单版算法:
1.得到字符串。
2.得到字符串长度。
3.判断数组那些是0,1,2…需要遍历10次,分别统计输入。同时输出。
好的地方:善用数组相关函数,简便,很容易改造成多数据输入版,只需要通过将scanf外加一个判断EOF的while和每次输出结束后将b还原为’0’.

首先上简单版

#include <stdio.h>
#include <string.h> 
int main() {
    int n,i,j;
    char a[1000],b='0';
    scanf("%s",a);
   i=strlen(a);
    while(b<='9'){//统计1~9每一个数字出现次数 
        n=0;
        for(j=0;j<i;j++) {
        if(a[j]==b) n++; 
        } 
        if(n!=0) 
            printf("%c:%d\n",b,n);//如出现次数不为0,输出 
      b+=1; 
    } 
return 0; 
}

我写的版本1 1.输入一个字符 2.判断一次0-9,记到i0-i9,判断是否能输出 3.继续,直到’\0’判断结束,输出一个值代表能输出 4.输出一次,重新初始化,再重复循环 好的地方:其实可以没必要用数组,一个值就够了。 缺点:多出了字符个数次+1次能否输出的判断。 变量个数过多。

#include<stdio.h>
int main(){ 
int i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,u;
i0=0; i1=0; i2=0; i3=0; i4=0; i5=0; i6=0; i7=0; i8=0; i9=0;/*我要做的: 首先用重复多组输入,输入到c 然后直接判断个数?输出一次?然后再输入一次再 */ 
char c[1001];
for(int i=0;scanf("%c",&c\[i\])!=EOF;i++){
    for(u=0;u<1;u++){
    switch(c\[i\]){
    case'0':i0++;break; case'1':i1++;break; case'2':i2++;break;
    case'3':i3++;break; case'4':i4++;break; case'5':i5++;break;
    case'6':i6++;break; case'7':i7++;break; case'8':i8++;break;
    case'9':i9++;break; case'\n':u=2;break; 
    } 
    if(u==2){
        if(i0!=0)printf("0:%d\n",i0);
      if(i1!=0)printf("1:%d\n",i1); 
      if(i2!=0)printf("2:%d\n",i2); 
      if(i3!=0)printf("3:%d\n",i3); 
      if(i4!=0)printf("4:%d\n",i4); 
      if(i5!=0)printf("5:%d\n",i5); 
      if(i6!=0)printf("6:%d\n",i6); 
      if(i7!=0)printf("7:%d\n",i7); 
      if(i8!=0)printf("8:%d\n",i8); 
      if(i9!=0)printf("9:%d\n",i9); 
     i=0; i0=0; i1=0; i2=0; i3=0; i4=0; i5=0; i6=0; i7=0; i8=0; i9=0;         }
  } 
} 
return0; 
} 

我参考简单版后写的版本二 1.直接输入数组 2.直接判断 3.其他地方跟版本1一样

int main(){
charc[1000];
intu,n,v; inti0,i1,i2,i3,i4,i5,i6,i7,i8,i9; i0=0; i1=0; i2=0; i3=0; i4=0; i5=0; i6=0; i7=0; i8=0; i9=0; n=0; v=0; 
while(scanf("%s",c)!=EOF){ 
for(n=0;c\[n\]!='\\0';n++) for(u=0;u<=n;u++){ switch(c\[u\]){ case'0': i0++; break; case'1': i1++; break; case'2': i2++; break; case'3': i3++; break; case'4': i4++; break; case'5': i5++; break; case'6': i6++; break; case'7': i7++; break; case'8': i8++; break; case'9': i9++; break; case'\\0': v=2; break; } 
if(v==2){ if(i0!=0)printf("0:%d\\n",i0); if(i1!=0)printf("1:%d\\n",i1); if(i2!=0)printf("2:%d\\n",i2); if(i3!=0)printf("3:%d\\n",i3); if(i4!=0)printf("4:%d\\n",i4); if(i5!=0)printf("5:%d\\n",i5); if(i6!=0)printf("6:%d\\n",i6); if(i7!=0)printf("7:%d\\n",i7); if(i8!=0)printf("8:%d\\n",i8); if(i9!=0)printf("9:%d\\n",i9); u=0; n=0; i0=0; i1=0; i2=0; i3=0; i4=0; i5=0; i6=0; i7=0; i8=0; i9=0; } } } }

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 [email protected]

Title:经典例题-个位数统计

Count:1.1k

Author:emon100

Created At:2018-11-06, 23:46:34

Updated At:2020-01-27, 17:18:09

Url:https://blog.emon100.me/2018/11/06/%E7%BB%8F%E5%85%B8%E4%BE%8B%E9%A2%98-%E4%B8%AA%E4%BD%8D%E6%95%B0%E7%BB%9F%E8%AE%A1/

Copyright: 'Attribution-non-commercial-shared in the same way 4.0' Reprint please keep the original link and author.