从C中的整数中提取数字?
此函数用于垂直打印从C中的整数中提取数字?,c,integer-division,C,Integer Division,此函数用于垂直打印num中的数字,但是当我运行它时,它只打印0。我知道它得到了正确的位数,因为它打印的零数与数字中的数字数相同,所以我在这里使用模或除法肯定有问题,我似乎找不到它。任何帮助都将不胜感激,谢谢 获取数字的函数(问题可能在这里?): void getNum() { int num,数字=0; printf(“输入要垂直打印的数字:”); scanf(“%d”和&num); if(num0){ 最小值=打印(数字/10,数字-1); 如果(数量%10) printf(“%s%d\
num
中的数字,但是当我运行它时,它只打印0。我知道它得到了正确的位数,因为它打印的零数与数字中的数字数相同,所以我在这里使用模或除法肯定有问题,我似乎找不到它。任何帮助都将不胜感激,谢谢
获取数字的函数(问题可能在这里?):
void getNum()
{
int num,数字=0;
printf(“输入要垂直打印的数字:”);
scanf(“%d”和&num);
if(num<0)
{
数字=1;
}
while(num)
{
num=num/10;//问题出在这里。当我将num传递给print()时,num为0
digits++;//只需添加一个新变量即可修复。谢谢大家!
}
打印(数字、位数);
}
我看不出你的代码有什么问题,只是太复杂了,不必要地使用浮点数学
这里有一个替代方案:
void getNum()
{
int num, digits=0;
printf("Enter a number to be printed vertically: ");
scanf("%d", &num);
if(num < 0)
{
digits = 1;
}
while(num)
{
num = num/10; //Here was the problem. Num was 0 once i passed it to print()
digits++; //Simply added a new variable to fix it. Thanks all!
}
print(num, digits);
}
诀窍是在递归调用之后移动打印。这允许更简单的逻辑。这是我问题的解决方案。在将其传递给函数之前,我将
num
设置为0
。我只是声明了另一个变量num1
,以在while循环中使用,而不是传递给函数的实际num
代码
通过对代码的一点小小的更改,我得到了一个代码版本,该版本消除了数字
参数,并且适用于负数
代码
现在如果我们调用
print()
输出
int number = INT_MIN;// a negative number
print(-120);
printf("\n");
print(-321);
print(number);
[Edit3]
将代码更改为也适用于打印(0)
int zeroSignal=1;
无效打印(整数)
{
#如果INT_最小值<-INT_最大值
///二者相辅相成。
///处理特殊情况
如果(num==INT\u MIN){
///fprintf(stderr,“休斯顿,我们有个问题”\n);
//可能在这里返回或退出。
//~ 2147483647 -> 2147483648
打印(整数最大值/10);
打印(INT_MIN%10);//便携式版本///打印(8);
返回;
}
如果(num<0){
//num=-((无符号)num);
num*=-1;
}
#恩迪夫
if(num==0&&zeroSignal){
printf(“只有零:%d\n”,0);
}
如果(数值>0){
零信号=0;
打印(个/10);
printf(“%d\n”,数量%10);
}
零信号=1;
}
在上面的代码中,我使用全局整数zeroSignal
实现了一种适用于print(0)
int-print(int-num,int-digits)的方法
{
int min=0;
如果(数字>0){
最小值=打印(数字/10,数字-1);
如果(数量%10)
printf(“%s%d\n”,num<0&&!(min++)?“-”:“”,abs(num%10));
}
返回最小值;
}
int print1(int num,int位数)
{
int min=0;
如果(数字>0){
最小值=打印1(数字/10,数字-1);
如果(数量%10)
{
printf(“%s”,num<0&&!(min++?“-\n”:”);
printf(“%u\n”,abs(num%10));
}
}
返回最小值;
}
int main()
{
印刷品(-1234,9);
printf(“\n-------------\n\n”);
打印1(-23456565,9);
}
适合我。您的输入是什么?pow()
可能返回一个刚好低于预期整数值的值。最好对结果进行四舍五入四舍五入(pow(10位数字))代码>在截断为int
之前。请确保首先#包括
我只需输入任意长度的随机数,并始终得到所有0,与位数相同的数字。也许我刚才添加的函数就是错误所在。(获取数字)嗯,看着它,我意识到我是多么愚蠢。在将num传递给函数之前,我将num设置为0。我道歉!当num<0
时,这有一个有趣的输出。但是OP也是。我复制粘贴到我的代码中,仍然奇怪地得到了所有0…我编辑了上面的内容以添加我的getNum函数,也许问题就在那里?@abzib:是的,问题就在那里。您修改num
直到它变为零,然后对其新的零值调用print。@chux,可能不重要,但在开始时添加此条件以解决此问题<代码>如果(num@chux“RealStimeMeNICA,OK。我想现在它处理了<代码> -In MultMIN <代码> > <代码>打印(8);假定代码> InthMI==-2147483648 < /COD>。假设不需要也不可移植编程。请考虑<代码>打印(In Min % 10);<代码> >删除<代码> fPrtuf(STDRR,…< /代码>)。
void print(int num, int digits)
{
if (digits > 0) {
print(num / 10, digits - 1);
printf("%d\n", num % 10);
}
}
void getNum()
{
int num, num1, digits=0;
//get the num
printf("Enter a number to be printed vertically: ");
scanf("%d", &num);
num1 = num;
//Loop to find how many digits are in the number
while(num1)
{
num1 = num1/10;
digits++;
}
//call function to print
print(num, digits);
}
void print(int num)
{
if (num < 0){
num *=-1;
}
if (num > 0) {
print(num / 10);
printf("%d\n", num % 10);
}
}
void print(int num)
{
#if INT_MIN < -INT_MAX
///In two's complements systems.
///handle special case
if ( num == INT_MIN ) {
//fprintf(stderr, "Houston, we have a problem\n");
// Maybe return or exit here.
//~ 2147483647 -> 2147483648
print(INT_MAX/10);
print(INT_MIN%10); //portable version ///print(8);
return;
}
if (num < 0){
//num =-((unsigned)num);
num *=-1;
}
#endif
if (num > 0) {
print(num / 10);
printf("%d\n", num%10);
}
}
int number = INT_MIN;// a negative number
print(-120);
printf("\n");
print(-321);
print(number);
1
2
0
3
2
1
Houston, we have a problem
int zeroSignal=1;
void print(int num)
{
#if INT_MIN < -INT_MAX
///In two's complements systems.
///handle special case
if ( num == INT_MIN ) {
///fprintf(stderr, "Houston, we have a problem\n");
// Maybe return or exit here.
//~ 2147483647 -> 2147483648
print(INT_MAX/10);
print(INT_MIN%10); //portable version ///print(8);
return;
}
if (num < 0){
//num =-((unsigned)num);
num *=-1;
}
#endif
if (num==0 && zeroSignal){
printf("Only zero: %d\n", 0);
}
if (num > 0) {
zeroSignal = 0;
print(num / 10);
printf("%d\n", num%10);
}
zeroSignal = 1;
}
int print(int num, int digits)
{
int min = 0;
if (digits > 0) {
min = print(num / 10, digits - 1);
if(num %10)
printf("%s%d\n", num < 0 && !(min++) ? "-" : "", abs(num % 10));
}
return min;
}
int print1(int num, int digits)
{
int min = 0;
if (digits > 0) {
min = print1(num / 10, digits - 1);
if(num %10)
{
printf("%s", num < 0 && !(min++) ? "-\n" : "");
printf("%u\n", abs(num % 10));
}
}
return min;
}
int main()
{
print(-1234, 9);
printf("\n-------------\n\n");
print1(-23456565, 9);
}