首页
社区
课程
招聘
[旧帖] [求助]c语言最简单的加法代码 0.00雪花
发表于: 2011-8-24 16:11 2125

[旧帖] [求助]c语言最简单的加法代码 0.00雪花

2011-8-24 16:11
2125
最近在学C语言,连入门阶段都算不上。
现在出了习题, 没有老师先帮忙画出流程图来,代码就一片茫然。。
希望大家帮我写段代码吧。我学习一下。

11+111+1111+11111+111111 ............. + 111111111 = (?)

希望各位大鸟门空闲的时间可以帮忙写一下这个代码。我学习一下。。。

另外,跟大家请教一下,C语言有什么比较好的入门书籍电子书或视频吗?

谢谢各位啦。。。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 96
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
郝斌的C不错,入门级的,讲得还行
2011-8-24 16:16
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
void sum(int n)
{
unsigned int sum = 0;
unsigned int a = 11;
for ( i = 0; i < n; i ++)
{
sum +=a;
a = a *10+1;
}
}
------------------------
仅供学习
2011-8-24 16:58
0
雪    币: 351
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
ls没考虑溢出吧
2011-8-24 17:01
0
雪    币: 51
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
#include<stdio.h>
int main(int argc,char *argv[])
{
int i=1,sum=0,j,n;
scanf("%d",&n);
for(j=1;j<=n;j++)
  {
  i=i*10+1;
  sum=sum+i;
  }
printf("%d\n",sum);
return 0;
}

gcc -Wall编译通过,
输入
9
输出
1234567899
不知对不对
-------------------华丽丽的分割线--------------------
多谢ls提醒,当n>16就溢出了,那我就重新写
#include<stdio.h>
struct zk {int i,sum;};

struct zk fun(long unsigned int n,long unsigned int sum)
{
int i;
n=n+(n-1)*10+(n-2)*100;
i=n % 1000;
sum=n / 1000;
struct zk z={i,sum};
return z;
}

int main(int argc,char *argv[])
{
int sum,n=32767,i;
struct zk z;
while((n>32766)||(n<2)) scanf("%d",&n);
int a[n];
for(i=0;i<=n;++i) a[i]=-1;
i=1;
a[0]=n*11+(n-1)*100+(n-2)*1000;
sum= a[0] / 1000;
a[0]=a[0] % 1000;
n-=3;
while(n>0){
  z=fun(n,sum);
  a[i]=z.sum + z.i;
  sum=a[i] / 1000;
  a[i]=a[i] % 1000;
  n-=3;
  i+=1;
}
for(;i>=0;--i) if (a[i] !=(-1)) printf("%d",a[i]);
printf("\n");
return 0;
}
/*
还是gcc -Wall 编译通过,花了很久的时间总算写好了
这个程序输入12345都能算出来

额,好吧,我把题目看成了:11+11+111+1111......
                                                (加两个11)
所以我的代码错了,但只要修改下就可以了
说是不会溢出,但是那些数字好诡异,我怀疑还是溢出了,还是有数学奥秘之类的
希望有大虾帮我研究下,谢谢
*/
-------------------华丽丽的分割线--------------------

我推荐linuxC编程一站式学习这本书,很不错
没基础都可以入门(不过数学基础还是要的)
2011-8-24 17:09
0
雪    币: 166
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这种最简单的都做不来!看来你娃儿还没入门哦!基础不行哈!
2011-8-24 17:11
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢大家的热心帮忙!
2011-8-25 11:34
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
在不溢出的情况下,考虑结果的规律性,是否可以直接写出
2011-8-25 12:57
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我觉得3楼的这个应该很不错啊,蛮简洁的,添加一个main函数把n(最后有1的个数-2就可以,因为a=11,已经用了2位了。)的值传到子函数里面就可以了。
2011-8-25 22:03
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
额额…如果很多个1的话可以用高精度加法的思想来写这题,简单说就是用数组每个元素代表一个很大数字的一位数,加上利用本题的特殊性质:

               11
             111
            1111
                ...
        +1......1

      易得此题答案为 f[i]=((n-i+1)/10+(n-i))mod 10,因为不是从1开始,所以要注意处理下初识部分,时间复杂度O(n),计算到10w个1也可以的。代码如下:

#include<stdio.h>
int main()
{
        int i,j,n,tmp,s[100005]={0};
        scanf("%d",&n);    //n是指有n个数
        s[1]=n/10;s[0]=n%10;   //初始化
        for(i=0;i<=n;i++){
                s[i+1]+=n-i;
                s[i+2]=s[i+1]/10;
                s[i+1]%=10;
        }
        for(i=n;i>=0;i--)       //是逆序存的哦
                printf("%d",s[i]);
        return 0;
}

另…求教有什么办法能让代码保持缩进呢?
2011-8-27 02:16
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
好吧原来会有缩进诶,肿么预览里木有呢?
囧……
2011-8-27 02:22
0
游客
登录 | 注册 方可回帖
返回
//