给定一个自然数n,求其各位数字之和

给定一一个自然数n,求其各位数字之和,重复上一过程,一直得到1~9之间的数。例如数1234的各位数字之和为10,继续计算,得到10的各位数字之和为1。

这思路很简单啊
输入作为字符串;取出字符串各位上的值,化为数字相加;若和大于9,则把和作为输入重复之前的步骤

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7512285
  • 这篇博客你也可以参考下:【C语言】输入一个整数n,求它的位数以及各位数字之和。例如,123的位数是3,各位数字之和是6。
  • 除此之外, 这篇博客: 数字字符串删除n个字符,使结果最小中的 方法二: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 贪心算法求解。最优解是删除出现的第一个左边>右边的数,因为删除之后高位减小;每次删除一个数,一共执行n次,留下的数总是当前最优解。

    #include <iostream>
    #include <string>
    using namespace std;
    //从数字字符串s中删除n个字符,使结果最小
    string deleteKNumbers(string &str, int k)
    {
    	bool flag;
    	for (int i = k; i > 0; i--)
    	{
    		flag = 0;
    		for (auto start = str.begin(); start < str.end() - 1; ++start)
    		{
    			if (*start > *(start + 1))		// 每次删除第一个比下一个数字大的数
    			{
    				str.erase(start);
    				flag = 1;
    				break;
    			}
    		}
    		if (!flag)							//如果所有数字递增,则删除最后几个数字直接返回
    		{
    			str.erase(str.end() - i, str.end());
    			break;
    		}
    	}
    	return str;
    }
    
    int main()
    {
    	string s;
    	int n;
    	while (cin>>s>>n)
    		cout << deleteKNumbers(s, n) << endl;
    	return 0;
    }
    
  • 以下回答由chatgpt基于相关博客总结生成:

    方法一:利用循环结构

    思路:

    1. 输入一个小于1000的正数;
    2. 如果不满足条件,则重新输入;
    3. 计算输入数的平方根并输出整数部分。

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int main()
    {
        int x;
        float y;
        printf("Please enter number:");
        scanf("%d", &x);
        while (x >= 1000){
            printf("Please enter number:");
            scanf("%d", &x);
        }
        y = sqrt(x);
        printf("%d value is %d\n", x, (int)y);
        system("pause");
        return 0;
    }
    

    方法二:利用函数的模块化设计

    思路:

    1. 定义输入函数来输入小于1000的正数;
    2. 定义输出函数来计算输入数平方根并输出整数部分;
    3. 主函数中调用输入函数并判断输入是否符合条件;
    4. 输出函数中调用输入函数来判断和重新输入。

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    void input();
    void value();
    
    int n;
    
    int main()
    {
        input();
        value();
        system("pause");
        return 0;
    }
    
    void input()
    {
        printf("Please enter number:");
        scanf("%d", &n);
        while (n >= 1000){
            printf("Please enter number:");
            scanf("%d", &n);
        }
    }
    
    void value()
    {
        double y;
        while (n >= 1000)
            input();
        y = sqrt(n);
        printf("%d value is %d\n", n, (int)y);
    }
    

    方法三:动态分配内存

    思路:

    1. 定义输入函数来输入小于1000的正数;
    2. 定义输出函数来计算输入数平方根并输出整数部分;
    3. 在主函数中动态分配内存,调用输入函数和输出函数;
    4. 在输入函数中循环判断输入是否符合条件。

    代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    void input(int *n);
    void sqr(int n);
    
    int main()
    {
        int *num=(int*)malloc(sizeof(int));
        input(num);
        sqr(*num);
        system("pause");
        return 0;
    }
    
    void input(int *n)
    {
        printf("Enter number: ");
        scanf("%d", n);
        while(*n>=1000||*n<0){
            printf("Error! Enter number: ");
            scanf("%d", n);
        }
    }
    
    void sqr(int n)
    {
        double r=sqrt((double)n);
        printf("Result: %.lf\n", r);
    }