给定一一个自然数n,求其各位数字之和,重复上一过程,一直得到1~9之间的数。例如数1234的各位数字之和为10,继续计算,得到10的各位数字之和为1。
这思路很简单啊
输入作为字符串;取出字符串各位上的值,化为数字相加;若和大于9,则把和作为输入重复之前的步骤
贪心算法求解。最优解是删除出现的第一个左边>右边的数,因为删除之后高位减小;每次删除一个数,一共执行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;
}
方法一:利用循环结构
思路:
代码:
#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;
}
方法二:利用函数的模块化设计
思路:
代码:
#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);
}
方法三:动态分配内存
思路:
代码:
#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);
}