电脑/网络 > 编程语言 > C/C++ 5

截数问题:任意一个自然数,我们可以将其平均截取成三个自然数。例如自然数135768,可以截取成13,57,68三个自然数。如果某自然数不能平均截取(位数不能被3整除),可... 截数问题: 任意一个自然数,我们可以将其平均截取成三个自然数。例如自然数135768,可以截取成13,57,68三个自然数。如果某自然数不能平均截取(位数不能被3整除),可将该自然数高位补零后截取。现编程从键盘上输入一个自然数N(N的位数<12),计算截取后第一个数加第三个数减第二个数的结果。 展开
 我来答
snowland
2013-07-24 · 知道合伙人软件行家
snowland
知道合伙人软件行家
采纳数:1229 获赞数:7313
多次参加C++算法类竞赛获奖。

向TA提问 私信TA
展开全部

以上的的方法没有必要

 

我的思路是把数字变成字符输入。这样,直接用strlen就能知道位数。

而且只需要加上'\0’,用itoa()就能实现字符数组到整数的转化。

这实际上是很放便的。

 

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
const int N=15;
int main()
{
 char num[N],first_num[N],second_num[N],third_num[N];
 int i=0,temp=0;
 scanf("%s",num);/*输入这个数*/
 for(temp=0,i=0;temp<strlen(num)/3;temp++,i++)
  third_num[temp]=num[i];
 third_num[temp]='\0';
 for(temp=0;temp<strlen(num)/3;temp++,i++)
  second_num[temp]=num[i];
 second_num[temp]='\0';
 for(temp=0;num[i]!='\0';temp++,i++)
  first_num[temp]=num[i];
 first_num[temp]='\0';
 /*以上是取出3个数字*/
 printf("%d\n",atoi(first_num)+atoi(third_num)-atoi(second_num));
 return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xoaxa
2013-07-25 · TA获得超过8610个赞
知道大有可为答主
回答量:6415
采纳率:72%
帮助的人:3473万
展开全部

/*

无符号整数(0:结束) : 6839

0 - 68 + 39 = -29

无符号整数(0:结束) : 30254

3 - 2 + 54 = 55

无符号整数(0:结束) : 85

0 - 8 + 5 = -3

无符号整数(0:结束) : 58

0 - 5 + 8 = 3

无符号整数(0:结束) : 1234

0 - 12 + 34 = 22

无符号整数(0:结束) : 12345

1 - 23 + 45 = 23

无符号整数(0:结束) : 123456

12 - 34 + 56 = 34

无符号整数(0:结束) : 1234567

1 - 234 + 567 = 334

无符号整数(0:结束) : 12345678

12 - 345 + 678 = 345

无符号整数(0:结束) : 123456789

123 - 456 + 789 = 456

无符号整数(0:结束) : 0

Press any key to continue

*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
char *Itoa(unsigned n,char s[]) {
int i,len;
itoa(n,s,10);
while((len = strlen(s)) % 3) {
s[len + 1] = '\0';
for(i = len; i; --i)
s[i] = s[i - 1];
s[0] = '0';
}
return s;
}

char *Strncpy(char *dest,char *src,unsigned n) {
unsigned i;
for(i = 0;i < n && src[i]; ++i)
dest[i] = src[i];
dest[i] = '\0';
return dest;
}

int main() {
unsigned i,delta,num,a[3];
char s[12 + 1],t[4 + 1];
while(1) {
printf("无符号整数(0:结束) : ");
scanf("%u",&num);
if(num == 0) break;
Itoa(num,s);
delta = strlen(s)/3;
for(i = 0;i < 3; ++i)
a[i] = atoi(Strncpy(t,s + delta * i,delta));
printf("%d - %d + %d = %d\n",a[0],a[1],a[2],a[0] - a[1] + a[2]);
}
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
暮鼓晨钟cy
2013-07-24 · TA获得超过282个赞
知道小有建树答主
回答量:205
采纳率:100%
帮助的人:55.5万
展开全部
先输入数据,然后判断数字的位数,然后判断每截数字的位数,通过取模和除法将数字拆成3段并记录在数组中,最后计算。

#include<iostream>
using namespace std;
int main()
{
int num; //输入的自然数
int n[3]; //平均分成3截
int i=1;
int a=10;

cin >> num; //输入N
while(i++) //判断N的位数
{
if(num/a == 0)
break;
a*=10;
}
i--;
if(i%3) //判断每截数字的位数
i = i/3+1;
else i/=3;

//拆分数字
a=1;
for(int j=0;j<i;j++)
a*=10;
n[2]=num%a;
num=num/a;
n[1]=num%a;
n[0]=num/a;
cout << n[0]+n[2]-n[1] << endl; //输出结果

return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式