C 整数长度未知时保持前导零
以下程序反转用户输入。但是,对于带有尾随零的数字,在打印反向数字时,零将被“忽略”C 整数长度未知时保持前导零,c,integer,reverse,C,Integer,Reverse,以下程序反转用户输入。但是,对于带有尾随零的数字,在打印反向数字时,零将被“忽略” #包括 内部主(空) { int n,反向编号=0,余数; printf(“输入一个整数:”); scanf(“%d”和“&n”); 而(n!=0) { 余数=n%10; 反向编号=反向编号*10+余数; n/=10; } printf(“反向编号=%d\n”,反向编号); 返回0; } 由于用户输入的整数长度未知,我们如何打印所有尾随零,例如: 输入一个整数:3000 反向编号=0003 整数长度未知 它不
#包括
内部主(空)
{
int n,反向编号=0,余数;
printf(“输入一个整数:”);
scanf(“%d”和“&n”);
而(n!=0)
{
余数=n%10;
反向编号=反向编号*10+余数;
n/=10;
}
printf(“反向编号=%d\n”,反向编号);
返回0;
}
由于用户输入的整数长度未知,我们如何打印所有尾随零,例如:
输入一个整数:3000
反向编号=0003
整数长度未知
它不是。:-)
计算迭代次数,并将其作为宽度传递给对printf
的最终调用
#include<stdio.h>
int main(void)
{
int n, reversedNumber = 0, remainder;
printf("Enter an integer: ");
scanf("%d", &n);
{
size_t i = (0 > n);
while (n != 0)
{
remainder = n % 10;
reversedNumber = reversedNumber * 10 + remainder;
n /= 10;
++i;
}
printf("Reversed Number = %0*d\n", (int) i, reversedNumber); /* Alternatively
to the cast you can define i as int. */
}
return 0;
}
#包括
内部主(空)
{
int n,反向编号=0,余数;
printf(“输入一个整数:”);
scanf(“%d”和“&n”);
{
大小i=(0>n);
而(n!=0)
{
余数=n%10;
反向编号=反向编号*10+余数;
n/=10;
++一,;
}
printf(“反向编号=%0*d\n”,(int)i,反向编号);/*或者
对于cast,可以将i定义为int*/
}
返回0;
}
发件人:
4每个转换规范都由字符%引入。在%之后,将依次显示以下内容:
[……]
- 可选的最小字段宽度。如果转换后的值的字符数少于字段宽度,则在字段宽度的左侧(或右侧,如果已给出后面介绍的左侧调整标志)填充空格(默认情况下)。字段宽度采用星号*(稍后介绍)或非负十进制整数的形式。[…])
你应该使用char数组(string),因为它的一般数学规则<强>我们没有考虑左边<0/强> 0。
#include <stdio.h>
#include <string.h>
int main(){
char value[]="3000";
printf(" Number : %s ",value);
char *rev=strrev(value);
printf("Reversed Number = %s ",rev);
return 0;
}
#包括
#包括
int main(){
字符值[]=“3000”;
printf(“编号:%s”,值);
char*rev=strrev(值);
printf(“反向编号=%s”,版次);
返回0;
}
由于用户输入的整数长度未知,如何打印所有尾随的零
可以知道整数文本长度。使用“%n”
记录扫描到该点的偏移量
要以数字方式反转字符串(显然可以进行简单的文本反转),请记录输入的长度 打印时,使用
“%0*u”
确保根据需要预先挂起前导零
样本运行
Enter an integer: 00123000
Reversed Number = 00032100
既然最终目标是“从原始数字的第二位到最后一位开始添加原始数字的位数”,那么为什么要使用字符(字符串)——只使用数字 如果我正确理解你的问题:
/* test.c sum the digits of a number -- except for the last digit */
#include <stdio.h>
int main (void)
{
int number;
printf ("\nenter a number: ");
scanf ("%i", &number);
// power = multiple of 10 matching left-most digit in number
// power is also a loop counter of sorts
int power = 1;
while ( number / power > 9 )
power *= 10;
// process each digit moving from left to right across number
// addition is commutative (order of digits does not affect result)
int sum = 0;
do {
int digit = number / power;
if ( power != 1 ) // skip last digit in number
sum += digit;
number %= power; // drop left-most digit from number
power /= 10; // adjust multiple of 10
}
while ( power > 0 );
printf ("sum (skipping last digit) = %i\n", sum);
return 0;
}
/*test.c对数字的位数求和——最后一位除外*/
#包括
内部主(空)
{
整数;
printf(“\n输入一个数字:”);
scanf(“%i”和编号);
//幂=数字中最左边匹配的10位数的倍数
//电源也是一种循环计数器
整数幂=1;
同时(数量/功率>9)
功率*=10;
//处理数字上从左向右移动的每个数字
//加法是可交换的(数字顺序不影响结果)
整数和=0;
做{
整数位数=数字/功率;
if(power!=1)//跳过数字中的最后一位
总和+=位数;
number%=幂;//从数字中删除最左边的数字
功率//=10;//调整10的倍数
}
而(功率>0);
printf(“总和(跳过最后一位)=%i\n”,总和);
返回0;
}
将其作为字符串阅读,然后将字符串反转。我之前已经这样做了,也许我需要为问题添加一些上下文。目标是从原始数字的第二位到最后一位添加原始数字的位数。这意味着将字符串转换回整数将丢失前导零@AndrewHenle@daumie所以,你问怎么做,但那不是你真正的问题?你需要明确你想知道什么。alk提供的答案准确地回答了问题。Getting:警告:字段宽度的类型应为“int”,但参数的类型为“size_t”(又名“unsigned long”)[-Wformat],并且我注意到添加了一个额外的零,例如3000被反转为00003。是的,您是正确的。我更正并注释了代码。请参阅我的负数修复。太好了!我忽略了负数。现在一切正常。谢谢。strev()
不是C,而是一些特定于供应商的扩展。
/* test.c sum the digits of a number -- except for the last digit */
#include <stdio.h>
int main (void)
{
int number;
printf ("\nenter a number: ");
scanf ("%i", &number);
// power = multiple of 10 matching left-most digit in number
// power is also a loop counter of sorts
int power = 1;
while ( number / power > 9 )
power *= 10;
// process each digit moving from left to right across number
// addition is commutative (order of digits does not affect result)
int sum = 0;
do {
int digit = number / power;
if ( power != 1 ) // skip last digit in number
sum += digit;
number %= power; // drop left-most digit from number
power /= 10; // adjust multiple of 10
}
while ( power > 0 );
printf ("sum (skipping last digit) = %i\n", sum);
return 0;
}