Have Fun with Numbers
题目
第一次做全英文编程题(词汇量严重不足,还需多记单词);
题目的大致意思就是说:输入一个不超过20位的整数,将这个数乘以2,比较计算前和计算后的结果是否满足题目的要求,
这个要求具体是指判断组成这两个数的具体数字出现的次数是否相等,例如:这个数为123456789,它乘以2之后得到246913578,
组成这两个数的数字为1、2、3、4、5、6、7、8、9,并且他们在123456789和246913578中出现的次数相等,所以满足题目的要求。
代码(思路在注释中)
#include<stdio.h> void printArray(int nums[],int len); int main() { //由于数字的位数比较长就算使用long long型,位数还是不够用 //所以需要用字符串来存储用户输入的数字 char str[20]; //字符串转换为的数组,存储用户输入的整型数字 int nums[20]; //原有的数组乘以2,存储数字计算后的结果 int nums1[20]; //用于判断计算前后的数字特征是否一致 //也就是计算前后每个数字出现的次数是否一样 int a[10] = {0}; int b[10] = {0}; //定义循环变量 int i = 0, j = 0; //定义数组长度,最后的判断标志 int len = 0, flag = 0; //接收用户输入的字符串 scanf("%s",str); //通过循环,每一位数字都乘以2,得到计算后的结果 while(str[i]!='\0'){ nums[i] = str[i]-'0'; nums1[i] = nums[i]*2; i++; len++; } //判断计算后的数组是否有进位 //如果有进位,则需要调整数组 for(i = len-1; i >= 1;i--) { if(nums1[i] >= 10){ nums1[i] = nums1[i] - 10; nums1[i-1] = nums1[i-1] + 1; } } //最简单的一种情况 //计算前后位数不同,直接否定 if(nums1[0] >= 10){ printf("No\n"); printArray(nums1,len); } //计算前后位数相同,比较各个数字出现的次数是否相同 else{ //统计计算前的数组中0~9出现的次数 for(i = 0; i < len; i++){ for(j = 0;j < 10; j++){ if(nums[i] == j) a[j]++; } } //统计计算后的数组中0~9出现的次数 for(i = 0; i < len; i++){ for(j = 0; j < 10 ; j++){ if(nums1[i] == j) b[j]++; } } //最后判断a,b两数组是否完全相同 //相同 ==> Yes //不同 ==> No for(i = 0; i < 10; i++){ if(a[i] != b[i]){ flag = 1; break; } } if(flag == 0) printf("Yes\n"); else printf("No\n"); printArray(nums1,len); } return 0; } //封装了一个用于打印数组的函数 void printArray(int nums[],int len) { int i = 0; for(i = 0; i < len; i++) { printf("%d",nums[i]); } printf("\n"); }
作者:陈太浪
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。