1 条题解

  • 1
    @ 2023-7-7 20:49:47

    【例50.3】 平衡数题解

    1、理解题意

    (搞清楚题目的意图,要我们编辑一个什么程序)

    1.1 搞清楚什么是平衡数

    平衡数:如果正整数 x 的每一位数字 d 恰好在 x 中出现了 d 次,则认为 x 是平衡数。 举例理解,1,22,122,221,333,1333,3133,3313,3331,22333,23233,23323等都是平衡数。

    1.2 看清题目的要求

    输入:l r(类型:整数,范围:1<=l<=r<=10000) 输出:l-r直接所有平衡数的和。

    样例输入: 1--->l 25--->r 样例输出: 因为1-25之间有两个平衡数,1和22 所以输出:23

    2、设计算法

    2.1 定义变量 2.2 变量初始化 2.3 输入起点和终点 2.4 给要计算的数组赋值 2.5 把要计算的数组的每个数取出来判断是不是平衡数 2.6 是平衡数累加器加上这个数

    3、代码示例

    #include<iostream>
    using namespace std;
    int main(){
    	int l,r,a,m=0;//l:要判断是不是平衡数的起点,r: 终点,a:每一次存要判断的数,m是累加器; 
    	int weishu[10],shuzu[10010];
    	//  weishu[10]用来存每个数个十百千万位上的数字, shuzu[10010]用来保存从l到r的数字 
    	cin >>l>>r; //输入l和r 
    	for(int i = l;i<=r;i++){ //此循环是把输入的l--->r之间的所有数字保存到shuzu[l]-- shuzu[r]
    		shuzu[i] = i;
    	}
    	for(int t = l;t<=r;t++){ //此循环是把shuzu[l]-- shuzu[r]的数一个个拿出来判断是不是平衡数 
    		int n=0;  // 这个变量是用来计数数字位数的 
    		a =shuzu[t];
    		for(int i = a;i!=0;i = i/10){ 
    		//循环初始值为要分解的数,循环终止条件是循环变量=0,每次循环后循环遍历除以10 
    			n++;//每循环一次n+1 
    			weishu[n]=i%10;// 此循环把变量a的个位存到weishu[1],十位存到weishu[2] 
    		}
    		int yorn = 0;   // 这个变量用来标记这个数是不是平衡数,0代表是。1代表不是 
    		for(int i = 1;i<=n;i++){
    			int sss = 0;  // 这个变量用来保存每位数在这个数字中出现的次数 
    			for(int j = 1;j<=n;j++){
    				if(weishu[i] == weishu[j]){
    					sss++;
    				}
    			}
    			if(sss != weishu[i]){ //判断每个位数在数字中出现的次数是不是等于自己 
    				yorn = 1;
    				break;
    			}
    		} 
    		if(yorn == 0){
    			m = m+a; 
    		} 
    	}
    	cout<<m;
    	return 0; 
    }
    
    • 1

    信息

    ID
    221
    时间
    1000ms
    内存
    64MiB
    难度
    7
    标签
    递交数
    32
    已通过
    10
    上传者