c语言小问题

【编程要求】1.编写函数intDel_findgcd(inta[],intn,int*f),对于a指向的数组中前n个元素,删除所有下标值为奇数的数组元素中保存的整数,求得... 【编程要求】
1. 编写函数int Del_findgcd(int a[],int n,int *f),对于a指向的数组中前n个元素,删除所有下标值为奇数的数组元素中保存的整数,求得数组中剩余的n/2(或n/2+1)个整数的最大公约数并将其保存到f指向的变量中。函数返回a数组中剩余整数的个数。
2. 编写main函数,声明一个一维数组并用测试数据初始化,调用Del_findgcd函数删除数组中的所有满足条件的整数并求出剩余整数的最大公约数,将数组中剩余的整数和这些整数的最大公约数输出到屏幕。最后将本人的学号符串也输出到屏幕。
【测试数据与运行结果】
测试数据: 6 8 9 11 12 13 15 16 18 19(n=10)
输出结果:6 9 12 15 18,max common divisor=3

下面是偶编的程序,哪位大大帮我看看错在哪?不胜感谢
#include<stdio.h>
#include<math.h>
int maxcd(int a, int b)
{ int c;
if(b>a) { a=a+b;
b=b-a;
a=b-a;
}
c=a%b;
while(c!=0)
{a=b;
b=c;
c=a%b;
}
return b;
}

int Del_findgcd(int a[], int n, int *f)
{
int i;
for(i=0;i<n;i++)
{ if (a[i]!='\0')
a[i/2]=a[i];
}
*f=maxcd(a[0],a[1]);
for(i=2;i<(n+1)/2;i++)
*f=maxcd(*f,a[i]);
ruturn (n+1)/2;
}
main()
{ int *f;
int j;
int a[10]={6,8,9,11,12,13,15,16,18,19};
int n=10
Del_findgcd(a,n,*f);
for(j=0;j<5;j++)
printf("%d",a[j]);
printf(", max common divisor=%d\n", *f);
printf("my number is 081270059\n");
}


展开
 我来答
创作者MLaTr5BS62
2019-11-17 · TA获得超过4052个赞
知道大有可为答主
回答量:3106
采纳率:27%
帮助的人:407万
展开全部

已经修改好了,请对比查找修改之处:
#include<stdio.h>
#define
M
10
#define
N
10
void
InputMatrix(int
*p,int
m,int
n);
int
FindMax(int
*p,int
m,int
n,int
*pRow,int
*pCol);
int
main()
{
 
 
int
a[M][N],m,n,row,col,max;
 
 
printf("input
m,n:");
 
 
scanf("%d,%d",&m,&n);
 
 
InputMatrix(*a,m,n);
 
 
max=FindMax(*a,m,n,&row,&col);
 
 
printf("max=%d,row=%d,col=%d\n",max,row,col);
getch();
 
 
return
0;
}
void
InputMatrix(int
*p,int
m,int
n)
{
 
 
int
i,j;
 
 
printf("input
%d*%d
array:\n",m,n);
 
 
for(i=0;i<m;i++)
 
 
{
 
 
 
 
for(j=0;j<n;j++)
 
 
 
 
{
 
 
 
 
 
 
scanf("%d",&p[i*n+j]);
 
 
 
 
}
 
 
}
}
int
FindMax(int
*p,int
m,int
n,int
*pRow,int
*pCol)
{
 
 
int
i,j,max=p[0];
 
 
*pRow=0;
 
 
*pCol=0;
 
 
for(i=0;i<m;i++)
 
 
{
 
 
 
 
for(j=0;j<n;j++)
 
 
 
 
{
 
 
 
 
 
 
if(p[i*n+j]>max)
 
 
 
 
 
 
{
 
 
 
 
 
 
 
 
max=p[i*n+j];
 
 
 
 
 
 
 
 
*pRow=i;
 
 
 
 
 
 
 
 
*pCol=j;
 
 
 
 
 
 
}
 
 
 
 
}
 
 
}
 
 
return
max;
}

创作者ZCMmbENq7K
2019-08-25 · TA获得超过3951个赞
知道大有可为答主
回答量:3102
采纳率:31%
帮助的人:432万
展开全部
这个就是大数相乘
/*
本程序假设所输入的大数均在20位以内,并且输入数字时候假定不出现非法情况(例如不存在这样情况123a78ty等)
这里只完成了大数的乘法运算
*/
#include
"stdio.h"
#define
MAX
21
void
InputNumber(int
[]);
//输入大数
void
InitNumber(int
[]);
//初始化用于存放结果的数组
void
Multi(int
[],int
[],int
[]);
//进行大数乘法
void
singleMulti(int
[],int,int
[]);
//对大数乘以一位数的函数
void
Add(int
[],int
[]);
//对结果进行错位相加
void
printresult(int
[]);
//输出结果
void
main()
{
int
largenumber1[MAX],largenumber2[MAX],mResult[2
*
MAX
-1];
//largenumber1[]和largenumber2[]表示要相乘的大数
//mResult[]表示结果存放的数组,显然其位数不会超过2
*
(MAX
-
1)
printf("Input
the
first
number:\n");
InputNumber(largenumber1);
printf("Input
the
second
number:\n");
InputNumber(largenumber2);
InitNumber(mResult);
Multi(largenumber1,largenumber2,mResult);
printf("The
result
is:\n");
printresult(mResult);
getchar();
}
void
InputNumber(int
largenumber[])
{
char
numberchar;
int
i
=
0;
scanf("%c",&numberchar);
while(numberchar
!=
'\n'
&&
i
<
MAX)
//最初输入大数用字符串表示
{
largenumber[++i]
=
numberchar
-
'0';
scanf("%c",&numberchar);
}
largenumber[0]
=
i;
//largenumber[0]表示大数的有多少位
}
void
InitNumber(int
result[])
{
for(int
i
=
0;
i
<
2
*
MAX
-
1;
i++)
result[i]
=
-1;
//赋初值为-1非常高明
}
void
Multi(int
number1[],int
number2[],int
result[])
{
int
i;
int
temper[2
*
MAX
-
1];
for(i
=
number2[0];
i
>=
1;
i--)
//number2[0]记录number2[
]大数到底有多少位
{
singleMulti(number1,number2[i],temper);
Add(result,temper);
}
}
void
singleMulti(int
number1[],int
number2,int
temper[])
{
int
i,t
=
0,c
=
2
*
MAX
-
2;
for(i
=
number1[0];
i
>=
1;
i--)
//number2[0]记录number2[
]大数到底有多少位
{
int
tempernumber
=
number2
*
number1[i];
temper[c--]
=
(tempernumber
+
t)
%
10;
t
=
(int)((tempernumber
+
t)
/
10);
}
if
(t
>
0)
{
temper[c]
=
t;
temper[0]
=
2
*
MAX
-
2
-
c
+
1;
//temper[0]记录所得的积最高位的确切位置,
//此时为有进位的情况
}
else
temper[0]
=
2
*
MAX
-2
-
c;
}
void
Add(int
result[],int
temper[])
{
static
int
pos
=
2
*
MAX
-
2;
//pos用来定位位置,用静态变量,别有一番用意
int
c
=
pos,t
=
0;
for(int
i
=
2
*
MAX
-
2;
i
>
2
*
MAX
-
2
-
temper[0];
i--)
{
if
(result[c]
==
-1)
result[c]
=
0;
int
tempernumber
=
result[c]
+
temper[i];
result[c--]
=
(tempernumber
+
t)
%
10;
t
=
(int)(tempernumber
/
10);
}
if
(t
==
1)
result[c]
=
1;
pos--;
}
void
printresult(int
result[])
{
for(int
i
=
1;
i
<
2
*
MAX
-
1
;
i++)
if
(result[i]
!=
-1)
printf("%d",result[i]);
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
化身智慧
推荐于2016-03-14 · TA获得超过237个赞
知道小有建树答主
回答量:130
采纳率:0%
帮助的人:101万
展开全部
/*1. 编写函数int Del_findgcd(int a[],int n,int *f),对于a指向的数组中前n个元素,
删除所有下标值为奇数的数组元素中保存的整数,求得数组中剩余的n/2(或n/2+1)个整数的最大公约数
并将其保存到f指向的变量中。函数返回a数组中剩余整数的个数。
2. 编写main函数,声明一个一维数组并用测试数据初始化,
调用Del_findgcd函数删除数组中的所有满足条件的整数并求出剩余整数的最大公约数,
将数组中剩余的整数和这些整数的最大公约数输出到屏幕。最后将本人的学号符串也输出到屏幕。
【测试数据与运行结果】
测试数据: 6 8 9 11 12 13 15 16 18 19(n=10)
输出结果:6 9 12 15 18,max common divisor=3 */

#include<stdio.h>
#include<math.h>
int maxcd(int a,int b)
{
int i,temp;
if(b>a)
{
temp=b;
b=a;
a=temp;
}
for(i=a;;i--)
if((a%i==0)&&(b%i==0))
break;
return i;
}

void Del_findgcd(int a[], int n, int *f)
{
int m,i,j=0;
for(i=0;i<n;i++)
{
if (i%2==0)
a[j++]=a[i];
}
a[j]='\0';
m=maxcd(a[0],a[1]);
for(i=2;i<5;i++)
m=maxcd(m,a[i]);
*f=m;

}
main()
{
int *f=NULL;
int j,m;
int a[10]={6,8,9,11,12,13,15,16,18,19};
int n=10 ;
Del_findgcd(a,n,f);

for(j=0;j<n/2;j++)
printf("%d",a[j]);
printf("\nmax common divisor=%d\n", *f;
printf("my number is 081270059\n");

}
这里我把你的源程序改了一点,但基本算法没变。你看行不行啊。好难找啊。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
创作者b4CUFPjS8V
2019-08-24 · TA获得超过3712个赞
知道大有可为答主
回答量:3096
采纳率:34%
帮助的人:249万
展开全部
全给你了,一次性帮你解决所有问题。
全部程序在Dev-c++和win-tc或vs2005下编译确认。
/*
大数相加简洁代码
*/
#include
<stdio.h>
#include
<string.h>
char*
add(char*
a,
char*
b,
char*
c)
{
const
char
*s1
=
a,
*s2
=
b;
/*
strrev()函数用来将字符串(数字)反序排列
*/
size_t
m
=
strlen(strrev(a)),
n
=
strlen(strrev(b)),
i
=
0;
char
u
=
0;
if(m
>
n)
{
size_t
tmp
=
m;
m
=
n;
n
=
tmp;
s1
=
b;
s2
=
a;
}
for(
;
i
<
m;
i++)
{
c[i]
=
s1[i]
-
'0'
+
s2[i]
+
u;
u
=
c[i]
>
'9'
?
c[i]
-=
10,
1
:
0;
}
for(
;
i
<
n;
i++)
{
c[i]
=
s2[i]
+
u;
u
=
c[i]
>
'9'
?
c[i]
-=
10,
1
:
0;
}
if(u
>
0)
c[i++]
=
'1';
c[i]
=
0;
strrev(a);
strrev(b);
return
strrev(c);
}
char
a[501],
b[501],
c[501];
/*这里设最多可以处理500位的大数相加,可更改*/
int
main()
{
int
n,
i;
printf("Please
input
times
you
want
to
plus:\n");
/*做加法的次数*/
scanf("%d",
&n);
for(i
=
1;
i
<=
n;
i++)
{
printf("Please
input
two
digits
you
want
to
plus:\n");
fflush(stdin);
gets(a);
gets(b);
printf("Case
%d:\n%s
+
%s
=
%s\n\n",
i,
a,
b,
add(a,
b,
c));
}
system("pause");
return
0;
}
--------------------------------------------------------------------
下面是带小数部分的高精度大数相减代码,我已经运行通过:
#include
<stdio.h>
#include
<string.h>
int
main()
{
char
s1[101],s2[101];
/*最后一位存放字符串结尾标识符'\0'*/
char
s3[101];
int
z1=0,z2=0,x1=0,x2,t,i,flag=0,m,j;
printf("请输入被减数:");
gets(s1);
printf("请输入减数:");
gets(s2);
while(s1[z1]>='0'&&s1[z1]<='9')
/*统计被减数的整数部分的位数*/
z1++;
while(s2[z2]>='0'&&s2[z2]<='9')
/*统计减数的整数部分的位数*/
z2++;
x1=strlen(s1)-z1-1;/*统计被减数的小数部分的位数*/
x2=strlen(s2)-z2-1;/*统计减数的整数部分的位数*/
t=strlen(s1);
/*下面部分是对两数的小数和整数部分的位数进行判断,并对位数少的进行补零操作*/
if
(x1<x2)
{
for(i=t;i<t+x2-x1;i++)/*被减数的小数后面补零,使其位数与减数相同*/
s1[i]='0';
}
s1[i]='\0';
t=strlen(s2);
if
(x1>x2)
{
for
(i=t;i<t+x1-x2;i++)/*减数的小数后面补零,使其位数与被减数相同*/
s2[i]='0';
}
s2[i]='\0';
if
(z1<z2)/*被减数的整数前面补零,使其位数与减数的整数位数相同*/
{
for(i=strlen(s1);i>=0;i--)
s1[i+z2-z1]=s1[i];
for
(i=0;i<z2-z1;i++)
s1[i]='0';
}
else
if
(z1>z2)/*减数的整数前面补零,使其位数与被减数位数相同*/
{
for(i=strlen(s2);i>=0;i--)
s2[i+z1-z2]=s2[i];
for(i=0;i<z1-z2;i++)
s2[i]='0';
}
for
(i=0;i<strlen(s1);i++)
{
if(s1[i]>s2[i])
break;
/*判断被减数是否大于减数*/
if(s2[i]>s1[i])
/*被减数与减数交换,并置标志位flag*/
{
strcpy(s3,s1);
strcpy(s1,s2);
strcpy(s2,s3);
flag=1;
break;
}
}
s3[strlen(s1)]='\0';
/*下面部分是对两数进行按位相减*/
for(i=strlen(s1)-1;i>=0;i--)
{
if
(s2[i]>s1[i])
/*判断被减数的对应位的树是否大于减数的对应位*/
{
m=1;
/*置1,表示有借位*/
j=i-1;
while(s1[j]=='0'||s1[j]=='.')
/*改变借位后前几位的值*/
{
if(s1[j]=='.')
/*若是小数点,无须改变*/
j--;
else
{
s1[j]='9';/*若为零,则借位后为9*/
j--;
}
}
s1[j]--;/*若不为零,则借位后应减1*/
}
else
m=0;
/*清零表示无借位*/
if
(s1[i]=='.')
s3[i]='.';
else
s3[i]=10*m+s1[i]-s2[i]+48;/*根据m,对两数对应的位进行相减,并转换成ASCII码*/
}
printf("结果为:");
if(flag)
printf("-");/*若结果为负数,则应先打印一个负号*/
i=0;
while(s3[i++]=='0'&&s3[i]!='.');/*略去前面的零*/
for(i=i-1;i<strlen(s3);i++)
printf("%c",s3[i]);
printf("\n");
getch();
return
0;
}
------------------------------------------------------------------
大数相乘简练代码
/*
大数相乘简洁代码
*/
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#define
MAXLEN
200
void
multiply(char
*num1,
char
*num2,
char
*mul)
{
int
i,
j,
k,
len1,
len2,
s[MAXLEN]={0};
char
*p;
len1
=
strlen(num1);
len2
=
strlen(num2);
for
(i=len1-1;
i>=0;
i--)
for
(j=len2-1;
j>=0;
j--)
{
k
=
len1+len2-2-i-j;
s[k]
+=
(num1[i]
-
'0')
*
(num2[j]
-
'0');
}
i
=
0;
while
(
i<=k
||
s[i]>=10
)
{
s[i+1]
+=
s[i]
/
10;
s[i]
%=
10;
i++;
}
while
(
i>0
&&
s[i]==0
)
i--;/*
除去开头可能产生的0
*/
p
=
mul;
while
(
i>=0
)
*p++
=
s[i--]
+
'0';
*p
=
'\0';
}
int
main(void)
{
char
s1[50],
s2[50],
*ps;
printf("Input
two
numbers:
\n");
gets(s1);
gets(s2);
ps
=
(char
*)malloc(sizeof(strlen(s1)+strlen(s2)+1));
multiply(s1,
s2,
ps);
printf("%s\n",
ps);
free(ps);
system("pause");
return
0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
创作者a3wsQhFv1p
2019-07-15 · TA获得超过3827个赞
知道大有可为答主
回答量:3136
采纳率:29%
帮助的人:234万
展开全部
void
swap(int
a,
int
b)
;void定义一个无返回值的子函数
{
int
t;
;定义整形变量t
if(a>b)t=a,
a=b,
b=t;
;让t作为中间变量,当a>b时交换a和b的值
}
;此时子函数结束,但是需要注意,这是一个无返回值的子函数,所以仅在子函数中交换了a和b的值,main函数中的a,b值并没变
main()
{
int
x=15,
y=12,
z=20;
;定义整形变量xyz并赋初值
if(x>y)
swap(x,y);
;如果x>y则调用子函数
if(x>z)
swap(x,z);
;如果x>z则调用子函数
if(y>z)
swap(y,z);
;;如果y>z则调用子函数
printf("%d\t%d\t%d\n",
x,y,z);
;输出x,y,z的值
}
这个程序由于使用变量名调用子函数,而且子函数是void无返回值函数,所以子函数中的操作并不影响主函数中的任何值
如果换用指针调用就不同了
希望我说清楚了,你能明白
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(18)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式