关于整数分解打印以及整数千分位分解打印的问题

galadrielna 学生  2017-11-18 01:12:02
大一新生一枚,最近在作业中遇到了1.整数分解打印题:输入一个整数如:输入1234,输出1 2 3 4
2.整数千分位分解题:输入一个整数如:输入1234567 , 输出1,234,567
(由于学校重视算法,所以开学两个月以来关于C语言只学到了do while函数等基础部分,然后转而讲算法思想,所以我的程序在简洁和优化方面可能存在许多不足,望能谅解阅读的不便
1.这是我对于整数分解打印的程序:

#include <stdio.h>

int main(int argc, char** argv) {
int i,longest,n,bn,t;//i用于方便计算循环次数,longest表示数字长度,bn,n表示与输入数字有关的变量,t计算幂次使用
i,longest=0;
t=1;
scanf("%d",&bn);
n=bn;
while(n/10!=0)
{
n=n/10;
i++;
}
longest=i+1;
n=bn;
i=0;
while(n/10!=0)
{
while(i<longest-1)
{
n=n/10;
i++;
if(n/10==0)
{
printf("%d ",n);
}
}
i=0;

while(i<longest-1)
{
t=10*t;
i=i+1;
}
longest=longest-1;
bn=bn%t;
n=bn;
i=0;
t=1;

}
printf("%d\n",n);

return 0;
}
2.然后我改编了一下,完成第二题,如下
#include <stdio.h>

int main(int argc, char** argv) {
int i,longest,n,bn,t;//i用于方便计算循环次数,longest表示数字长度,bn,n表示与输入数字有关的变量,t计算幂次使用
i,longest=0;
t=1;
scanf("%d",&bn);
n=bn;
while(n/10!=0)
{
n=n/10;
i++;
}
longest=i+1;
n=bn;
i=0;
while(n/10!=0)
{
while(i<longest-1)
{
n=n/10;
i++;
if(n/10==0)
{
printf("%d",n);
}
}
i=0;
while(i<longest-1)
{
t=10*t;
i=i+1;
}
if(longest%3==1) printf(",");//确定","的位置
longest=longest-1;
bn=bn%t;
n=bn;
i=0;
t=1;
}
printf("%d",n);

return 0;
}
3.这两个程序我在Devc++5.10上运行尝试是正确的,但是第2题在学校的OJ系统上却通过不了(真叫人头秃)
麻烦大神们帮忙看一下问题所在,同时也希望能多多提出我编程思想以及能力上的不足与缺点,谢谢
...全文
243 8 点赞 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
worldy 2017-11-23
//以三位分组,你自己举一反三 int n=43546,m,k; while(n>0) { k=n;//暂存循环结束的原数 n=n/1000; m=k-n*1000;//每次的最低三位 }
  • 打赏
  • 举报
回复
自信男孩 2017-11-23
引用 6 楼 bupt2017211230 的回复:
非常谢谢大家的回复,但其实我们考试时并不可以使用任何数组,子函数,递归等 只能用基础的迭代还有穷举算法。。。可能在我学了这些知识后就能更好的理解你们的程序了。
考试还能要求这些,那太死板了。解决问题,那种方法好就用那种方法呗。前提是自己能理解和运用
  • 打赏
  • 举报
回复
galadrielna 2017-11-23
非常谢谢大家的回复,但其实我们考试时并不可以使用任何数组,子函数,递归等 只能用基础的迭代还有穷举算法。。。可能在我学了这些知识后就能更好的理解你们的程序了。
  • 打赏
  • 举报
回复
赵4老师 2017-11-21
仅供参考:
char * comma(__int64 num) {
    static char commades[80];
    static char commasrc[80];

    sprintf(commasrc,"%I64d",num);
    int L=strlen(commasrc);
    register int j=0;
    register int k=0;
    for (int i=L-1;i>=0;i--) {
        commades[j]=commasrc[i];
        k++;
        j++;
        if ((k%3)==0 && i>0) {
            commades[j]=',';
            j++;
        }
    }
    commades[j]=0;
    strrev(commades);
    return commades;
}
  • 打赏
  • 举报
回复
自信男孩 2017-11-20
#include <stdio.h>
#include <math.h>

void show_digit(int num);
void show_digit_as_bit(int num, int bit);
int main(int argc, char** argv)
{
#if 1

    int num;

    while (scanf("%d", &num) > 0 && num > 0) {
        show_digit(num);
        printf("\n");
        show_digit_as_bit(num, 3);
        printf("\n");
    }

#else
    int i,longest,n,bn,t;
    i,longest=0;
    t=1;
    scanf("%d",&bn);
    n=bn;
    while(n/10!=0)
    {
        n=n/10;
        i++;
    }
    longest=i+1;
    n=bn;
    i=0;
    while(n/10!=0)
    {
        while(i<longest-1)
        {
            n=n/10;
            i++;
            if(n/10==0)
            {
                printf("%d ",n);
            }
        }
        i=0;

        while(i<longest-1)
        {
            t=10*t;
            i=i+1;
        }
        longest=longest-1;
        bn=bn%t;
        n=bn;
        i=0;
        t=1;

    }
    printf("%d\n",n);
#endif
    return 0;
}


void show_digit(int num)
{
    if (num > 0)
        show_digit(num / 10);
    if (num <= 0)
        return;
    printf("%d ", num % 10);
}

void show_digit_as_bit(int num, int bit)
{
    printf("****%d\n", num);
    int n = pow(10, bit);
    if (num > 0)
        show_digit_as_bit(num / n, bit);
    if (num <= 0)
        return;

    printf("%d ", num % n);
}
参考一下吧,其实用一个函数就可以实现你的两个功能;
void show_digit_as_bit(int num, int bit)
{
    printf("****%d\n", num);
    int n = pow(10, bit);
    if (num > 0)
        show_digit_as_bit(num / n, bit);
    if (num <= 0)
        return;

    printf("%d ", num % n);
}
实现第一个功能,只需要调用函数是第二个参数传1,实现第二个功能传3;即
#include <stdio.h>
#include <math.h>

void show_digit(int num);
void show_digit_as_bit(int num, int bit);
int main(int argc, char** argv)
{
    int num;

    while (scanf("%d", &num) > 0 && num > 0) {
        show_digit_as_bit(num, 1);
        printf("\n");
        show_digit_as_bit(num, 3);
        printf("\n");
    }
    return 0;
}


void show_digit(int num)
{
    if (num > 0)
        show_digit(num / 10);
    if (num <= 0)
        return;
    printf("%d ", num % 10);
}

void show_digit_as_bit(int num, int bit)
{
    int n = pow(10, bit);
    if (num > 0)
        show_digit_as_bit(num / n, bit);
    if (num <= 0)
        return;

    printf("%d ", num % n);
}
参考一下吧,递归方法
  • 打赏
  • 举报
回复
litchgu 2017-11-18
引用 1楼litchgu 的回复:
为什么提交不通过,时间太慢?没看怎么看你写的代码,1234567这个数,千分位分解,先%1000,得到567,再/1000得到1234,1234%1000,得到234,再/1000得到1,1%1000得到1,1/1000小于0退出循环。
最后=0退出循环,打错了。
  • 打赏
  • 举报
回复
litchgu 2017-11-18
为什么提交不通过,时间太慢?没看怎么看你写的代码,1234567这个数,千分位分解,先%1000,得到567,再/1000得到1234,1234%1000,得到234,再/1000得到1,1%1000得到1,1/1000小于0退出循环。
  • 打赏
  • 举报
回复
galadrielna 2017-11-18
引用 1 楼 litchgu 的回复:
为什么提交不通过,时间太慢?没看怎么看你写的代码,1234567这个数,千分位分解,先%1000,得到567,再/1000得到1234,1234%1000,得到234,再/1000得到1,1%1000得到1,1/1000小于0退出循环。
1.不是时间的问题 2.后来我又尝试了几个数例,发现数字中含有0就会使结果出现问题,我程序本身应该就某种情况没考虑到,或者根本有错误... 3.至于什么错误我还没来得及细看,要上课了先溜了,谢谢你啦
  • 打赏
  • 举报
回复
相关推荐
发帖
C语言
加入

6.5w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2017-11-18 01:12
社区公告
暂无公告