我是C的新手。我有一个课程作业,以垂直格式显示一个数字。如果用户输入5678,教师希望它在一列中垂直显示在屏幕上:
8
7
6
5
赋值的第二部分是找到相同数字的最大除数。 我完全迷失了。我从另一个函数中获取NUM值。公式似乎适用于偶数,但奇数。
int divisor (int NUM)
{
int index, count=0;
for(index=2;index<=(NUM/2);index=index+1)
{
if(NUM%index==0)
count++;
}
printf("\n\nThe largest divisor of %d is %d\n",NUM, index-1);
return(index);
}
答案 0 :(得分:1)
要垂直显示数字:
1. get least significant digit,
2. print it and print new line,
3. shift number to the right by one digit
4. goto 1
算法在数字为零时终止。拨打输入号码n
;获得最不重要(最右边)的数字可以使用n % 10
完成。可以使用n = n / 10
进行右移。
对于第二部分,观察最大除数不能超过n/2
(因为n = 2 * n/2
)。所以尝试从n/2
到1
的所有数字,并在找到除数后中断。您将找到最大的除数,因为您正在按降序排列数字。要检查x
除以y
是否使用y % x == 0
。
检查从sqrt(n)
到1
的数字的第二种方法。如果m
除以n
,我们可以为某些n = m * k
撰写k
。现在你拿max(m, n/m)
继续。
希望这会有所帮助:)
答案 1 :(得分:-1)
对于第一部分,有很多方法可以解决这个问题。但是,如果不使用太多标准库函数,这似乎是一个适合该问题的级别,我认为最简单的方法是将数字作为字符数组。然后通过字符数组中的索引访问每个值。这只需要stdio.h头文件。一些快速说明:只需使用printf打印每个索引中包含的值,并在结尾处抛出换行符\ n字符。如果你想将字符串转换为整数,你可以使用atd()函数很容易地做到这一点,该函数可以在stdlib.h中找到。如果要向后打印,可以简单地向后遍历数组。
void displayvert(char str[])
{
int i;
for (i = 0; str[i] != '\0'; ++i) {
printf("%c\n", str[i]);
}
}
接近第二个问题的方法也很多,但在第二个问题的情况下,我认为我会使用模数运算符并跟踪结果为零的最高值。为了使用单用户提供的输入,我实际上需要在stdlib.h头文件中的atoi()。基本上,从值1开始,您将值增加到刚好低于'num'本身值的整数。并且,如果当你除以它时的余数为零(使用模数运算符的目的),那么你知道它是可分的。因为我们从1升到数字本身,所以返回零余数的最后一个值是最大公约数。
void getgcd(int num)
{
int i, gcd;
// remember, you can't do x % 0!
for (i = 1; i < num; i++) {
if ((num % i) == 0 ) {
gcd = i;
}
}
printf("The greatest common divisor is: %d\n", gcd);
}
这里有主要功能和原型,因此您可以看到它们是如何捆绑在一起的。一些快速笔记(1)11位是任意的;但重要的是要注意我们使用10位数作为总输入值(您可以添加检查以强制执行)并保留第11位(在索引10处)以允许空终止字符\ 0。 (2)使用scanf抓取输入;请注意,因为字符数组不需要地址运算符&amp;因为它默认为那个。
#include <stdio.h>
#include <stdlib.h>
void displayvert(char str[]);
void getgcd(int num);
int main()
{
char input[11]; // additional character added for \0
printf("Please enter a value up to 10 digits: ");
scanf("%s", input);
displayvert(input);
getgcd(atoi(input));
return 0;
}