求助c语言,帮我看看还是不是处女哪里错了,注意是c文件不是cpp文件。

给定一个正整数n,判定n能否被13整除。
输入数据的第一行是一个整数T,(T&20)。接着有T行,每行上有一个用字符串表示的正整数n(长度不超过80),对应一种情形。
对于每一种情形,如果n被13整除,那么输出“Yes”,否则输出“No”&
Sample&Input
Sample&Output
#include&stdio.h&
#include&string.h&
#include&stdlib.h&
#include&math.h&
int&main()
&&&&char&a[1000];
&&&&int&i,j,l,n;
&&&&scanf(&%d&,&n);
getchar();
&&&&while(n--)&
char&b[1000]={0},c[1000]={0};
&&&&gets(a);&
&&&&l=strlen(a);
s=atoi(a);
{for(i=0;i&l-3;i++)
b[i]=a[i];
b[i+1]='\0';
for(j=0;i&l;i++)
&&&&c[j]=a[i];
c[i+1]='\0';
s=abs(atoi(b)-atoi(c));
&&&&if((int)s%13==0)&printf(&Yes\n&);
&&&&else&printf(&No\n&);
我自己测试的长数组都是对的啊可是还是传到网上还是WA&
回复讨论(解决方案)
if(i/*这应该是l吧*/&=3)
if(i/*这应该是l吧*/&=3)
是错了但是改了后还是不对啊。。。应该是字符串长度有问题吧
for(i=0;i&l-3;i++)
b[i]=a[i];
b[i+1]='\0';
for(j=0;i&l;i++)
&&&&c[j]=a[i];
c[i+1]='\0';
首先i+1都改i。其次你l=80的时候l-3是77,这itoa不是一样会爆?
s=abs(atoi(b)-atoi(c));&&这里的b只比a短3位而已,a最长到80的情况下b同样也是超出了atoi的范围。
我随便写了一段,不知道对不对,我自己试了一些数好像还行:
064616&&//&Yes
064613&&//&No
45&&//&Yes
#include&stdio.h&
int&main()
&&&&char&a[128];
&&&&int&T,&s;
&&&&char&*p;
&&&&scanf(&%d&,&T);
&&&&while(T--&&&0)
&&&&&&&&s&=&0;
&&&&&&&&scanf(&%s&,&a);
&&&&&&&&for&(p&=&a;&*p&!=&'\0';&p++)
&&&&&&&&&&&&s&=&(*p&-&'0'&+&s&*&10)&%&13;
&&&&&&&&if(s%13==0)&printf(&Yes\n&);
&&&&&&&&else&printf(&No\n&);
&&&&return&0;
数据这么大,必须用大数才行啊
s=abs(atoi(b)-atoi(c));&&这里的b只比a短3位而已,a最长到80的情况下b同样也是超出了atoi的范围。
我随便写了一段,不知道对不对,我自己试了一些数好像还行:
064616&&//&Yes
064613&&//&No
45&&//&Yes
#include&stdio.h&
int&main()
&&&&char&a[128];
&&&&int&T,&s;
&&&&char&*p;
&&&&scanf(&%d&,&T);
&&&&while(T--&&&0)
&&&&&&&&s&=&0;
&&&&&&&&scanf(&%s&,&a);
&&&&&&&&for&(p&=&a;&*p&!=&'\0';&p++)
&&&&&&&&&&&&s&=&(*p&-&'0'&+&s&*&10)&%&13;
&&&&&&&&if(s%13==0)&printf(&Yes\n&);
&&&&&&&&else&printf(&No\n&);
&&&&return&0;
可行,这题目就是要求用字符串操作来处理运算操作,不能转换成数字(会内存溢出的)来操作,
#include&&iostream&
#include&&string&
using&namespace&
inline&int&compare(string&str1,string&str2)&{//相等返回0,大于返回1,小于返回-1
&&&&&&&&&if&(str1.size()&str2.size())&return&1;&//长度长的整数大于长度小的整数
&&&&else&if&(str1.size()&str2.size())&return&-1;
&&&&else&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&pare(str2);&//若长度相等,则头到尾按位比较
string&SUB_INT(string&str1,string&str2);
string&ADD_INT(string&str1,string&str2)&{//高精度加法
&&&&int&sign=1;&//sign&为符号位
&&&&string&
&&&&if&(str1[0]=='-')&{
&&&&&&&&if&(str2[0]=='-')&{
&&&&&&&&&&&&sign=-1;
&&&&&&&&&&&&str=ADD_INT(str1.erase(0,1),str2.erase(0,1));
&&&&&&&&}&else&{
&&&&&&&&&&&&str=SUB_INT(str2,str1.erase(0,1));
&&&&}&else&{
&&&&&&&&if&(str2[0]=='-')&{
&&&&&&&&&&&&str=SUB_INT(str1,str2.erase(0,1));
&&&&&&&&}&else&{&//把两个整数对齐,短整数前面加0补齐
&&&&&&&&&&&&string::size_type&L1,L2;
&&&&&&&&&&&&int&i;
&&&&&&&&&&&&L1=str1.size();
&&&&&&&&&&&&L2=str2.size();
&&&&&&&&&&&&if&(L1&L2)&{
&&&&&&&&&&&&&&&&for&(i=1;i&=L2-L1;i++)&str1=&0&+str1;
&&&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&for&(i=1;i&=L1-L2;i++)&str2=&0&+str2;
&&&&&&&&&&&&}
&&&&&&&&&&&&int&int1=0,int2=0;&//int2&记录进位
&&&&&&&&&&&&for&(i=str1.size()-1;i&=0;i--)&{
&&&&&&&&&&&&&&&&int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;
&&&&&&&&&&&&&&&&int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;
&&&&&&&&&&&&&&&&str=char(int1+'0')+
&&&&&&&&&&&&}
&&&&&&&&&&&&if&(int2!=0)&str=char(int2+'0')+
&&&&//运算后处理符号位
&&&&if&((sign==-1)&&(str[0]!='0'))&str=&-&+
&&&&return&
string&SUB_INT(string&str1,string&str2)&{//高精度减法
&&&&int&sign=1;&//sign&为符号位
&&&&string&
&&&&int&i,j;
&&&&if&(str2[0]=='-')&{
&&&&&&&&str=ADD_INT(str1,str2.erase(0,1));
&&&&}&else&{
&&&&&&&&int&res=compare(str1,str2);
&&&&&&&&if&(res==0)&return&&0&;
&&&&&&&&if&(res&0)&{
&&&&&&&&&&&&sign=-1;
&&&&&&&&&&&&string&temp&=str1;
&&&&&&&&&&&&str1=str2;
&&&&&&&&&&&&str2=
&&&&&&&&string::size_type&
&&&&&&&&tempint=str1.size()-str2.size();
&&&&&&&&for&(i=str2.size()-1;i&=0;i--)&{
&&&&&&&&&&&&if&(str1[i+tempint]&str2[i])&{
&&&&&&&&&&&&&&&&j=1;
&&&&&&&&&&&&&&&&while&(1)&{//zhao4zhong1添加
&&&&&&&&&&&&&&&&&&&&if&(str1[i+tempint-j]=='0')&{
&&&&&&&&&&&&&&&&&&&&&&&&str1[i+tempint-j]='9';
&&&&&&&&&&&&&&&&&&&&&&&&j++;
&&&&&&&&&&&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&&&&&&&&&str1[i+tempint-j]=char(int(str1[i+tempint-j])-1);
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&str=char(str1[i+tempint]-str2[i]+':')+
&&&&&&&&&&&&}&else&{
&&&&&&&&&&&&&&&&str=char(str1[i+tempint]-str2[i]+'0')+
&&&&&&&&&&&&}
&&&&&&&&for&(i=tempint-1;i&=0;i--)&str=str1[i]+
&&&&//去除结果中多余的前导0
&&&&str.erase(0,str.find_first_not_of('0'));
&&&&if&(str.empty())&str=&0&;
&&&&if&((sign==-1)&&&&(str[0]!='0'))&str&=&-&+
&&&&return&
string&MUL_INT(string&str1,string&str2)&{//高精度乘法
&&&&int&sign=1;&//sign&为符号位
&&&&string&
&&&&if&(str1[0]=='-')&{
&&&&&&&&sign*=-1;
&&&&&&&&str1&=str1.erase(0,1);
&&&&if&(str2[0]=='-')&{
&&&&&&&&sign*=-1;
&&&&&&&&str2&=str2.erase(0,1);
&&&&int&i,j;
&&&&string::size_type&L1,L2;
&&&&L1=str1.size();
&&&&L2=str2.size();
&&&&for&(i=L2-1;i&=0;i--)&{&//模拟手工乘法竖式
&&&&&&&&string&
&&&&&&&&int&int1=0,int2=0,int3=int(str2[i])-'0';
&&&&&&&&if&(int3!=0)&{
&&&&&&&&&&&&for&(j=1;j&=(int)(L2-1-i);j++)&tempstr=&0&+
&&&&&&&&&&&&for&(j=L1-1;j&=0;j--)&{
&&&&&&&&&&&&&&&&int1=(int3*(int(str1[j])-'0')+int2)%10;
&&&&&&&&&&&&&&&&int2=(int3*(int(str1[j])-'0')+int2)/10;
&&&&&&&&&&&&&&&&tempstr=char(int1+'0')+
&&&&&&&&&&&&}
&&&&&&&&&&&&if&(int2!=0)&tempstr=char(int2+'0')+
&&&&&&&&str=ADD_INT(str,tempstr);
&&&&//去除结果中的前导0
&&&&str.erase(0,str.find_first_not_of('0'));
&&&&if&(str.empty())&str=&0&;
&&&&if&((sign==-1)&&&&(str[0]!='0'))&str=&-&+
&&&&return&
string&DIVIDE_INT(string&str1,string&str2,int&flag)&{//高精度除法。flag==1时,返回商;&flag==0时,返回余数
&&&&string&quotient,&//定义商和余数
&&&&int&sign1=1,sign2=1;
&&&&if&(str2&==&&0&)&{&&//判断除数是否为0
&&&&&&&&quotient=&&ERROR!&;
&&&&&&&&residue&=&&ERROR!&;
&&&&&&&&if&(flag==1)&return&
&&&&&&&&else&&&&&&&&&return&residue&;
&&&&if&(str1==&0&)&{&//判断被除数是否为0
&&&&&&&&quotient=&0&;
&&&&&&&&residue&=&0&;
&&&&if&(str1[0]=='-')&{
&&&&&&&&str1&&&=&str1.erase(0,1);
&&&&&&&&sign1&*=&-1;
&&&&&&&&sign2&&=&-1;
&&&&if&(str2[0]=='-')&{
&&&&&&&&str2&&&=&str2.erase(0,1);
&&&&&&&&sign1&*=&-1;
&&&&int&res=compare(str1,str2);
&&&&if&(res&0)&{
&&&&&&&&quotient=&0&;
&&&&&&&&residue&=str1;
&&&&}&else&if&(res&==&0)&{
&&&&&&&&quotient=&1&;
&&&&&&&&residue&=&0&;
&&&&}&else&{
&&&&&&&&string::size_type&L1,L2;
&&&&&&&&L1=str1.size();
&&&&&&&&L2=str2.size();
&&&&&&&&string&
&&&&&&&&tempstr.append(str1,0,L2-1);
&&&&&&&&for&(int&i=L2-1;i&L1;i++)&{&//模拟手工除法竖式
&&&&&&&&&&&&tempstr=tempstr+str1[i];
&&&&&&&&&&&&tempstr.erase(0,tempstr.find_first_not_of('0'));//zhao4zhong1添加
&&&&&&&&&&&&if&(tempstr.empty())&tempstr=&0&;//zhao4zhong1添加
&&&&&&&&&&&&for&(char&ch='9';ch&='0';ch--)&{&//试商
&&&&&&&&&&&&&&&&string&
&&&&&&&&&&&&&&&&str=str+
&&&&&&&&&&&&&&&&if&(compare(MUL_INT(str2,str),tempstr)&=0)&{
&&&&&&&&&&&&&&&&&&&&quotient=quotient+
&&&&&&&&&&&&&&&&&&&&tempstr&=SUB_INT(tempstr,MUL_INT(str2,str));
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&residue=
&&&&//去除结果中的前导0
&&&&quotient.erase(0,quotient.find_first_not_of('0'));
&&&&if&(quotient.empty())&quotient=&0&;
&&&&if&((sign1==-1)&&(quotient[0]!='0'))&quotient=&-&+
&&&&if&((sign2==-1)&&(residue&[0]!='0'))&residue&=&-&+residue&;
&&&&if&(flag==1)&return&
&&&&else&&&&&&&&&return&residue&;
string&DIV_INT(string&str1,string&str2)&{//高精度除法,返回商
&&&&return&DIVIDE_INT(str1,str2,1);
string&MOD_INT(string&str1,string&str2)&{//高精度除法,返回余数
&&&&return&DIVIDE_INT(str1,str2,0);
int&main()&{
&&&&string&s1,s2,
&&&&while&(cin&&s1&&ch&&s2)&{
&&&&&&&&switch&(ch)&{
&&&&&&&&&&&&case&'+':res=ADD_INT(s1,s2);
&&&&&&&&&&&&case&'-':res=SUB_INT(s1,s2);
&&&&&&&&&&&&case&'*':res=MUL_INT(s1,s2);
&&&&&&&&&&&&case&'/':res=DIV_INT(s1,s2);
&&&&&&&&&&&&case&'%':res=MOD_INT(s1,s2);
&&&&&&&&&&&&default&:&&&&&&&&&&&&&&&&&&&
&&&&&&&&cout&&res&&
&&&&return(0);
1&)用大数除法
2)用截尾法
不论如何都是大数运算
被13整除:&
若一个整数的个位数字截去,再从余下的数中,加上个位数的4倍,如果差是13的倍数,则原数能被13整除。如果差太大或心算不易看出是否13的倍数,就需要继续上述「截尾、倍大、相加、验差」的过程,直到能清楚判断为止。
验差可以偷个小懒,
位数&n位的不用验算,例如n=4,n=8
对于int&为&4Bits&的系统&可以在小于9,8&位十位数的时候,直接转换成&int&类型,验算(直接用除法计算)
对于int&为&4Bits&的系统&可以在小于4位十位数的时候,直接转换成&int&类型,验算&(直接用除法计算)
其实也可以不用大数,直接算1%13&10%13,100%13.....13次方内必然可以循环,因为80不大,直接开一个数组记录模13的余数也可以1702人阅读
编程学习(115)
关于.c 文件和.cpp 文件在工程中共存问题, 这篇文章写的比较清楚,感谢原作者!转载于:
  C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程 式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支 持函数的重载,C++对全局函数的处理方式与C有明显的不同。
2.从标准头文件说起
某企业曾经给出如下的一道面试题:为什么标准头文件都有类似以下的结构?
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern &C& {
#ifdef __cplusplus
#endif /* __INCvxWorksh */
显然,头文件中的编译宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用是防止该头文件被重复引用。那么
#ifdef __cplusplus
extern &C& {
#ifdef __cplusplus
的作用又是什么呢?我们将在下文一一道来。
3.深层揭密extern &C&
  extern &C& 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。让我们来详细解读这两重含义。
被extern &C&限定的函数或变量是extern类型的;
extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。记住,下列语句:
  仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。
通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数 时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编 译生成的目标代码中找到此函数。
与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块使用时,其不可能被extern “C”修饰。
被extern &C&修饰的变量和函数是按照C语言方式编译和连接的;
未加extern “C”声明时的编译方式
首先看看C++中对类似C的函数是怎样编译的。
作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:
void foo( int x, int y );
  该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。
_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。
同样地,C++中的变量 除支持局部变量外,还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名,我们以&.&来区分。而本质上,编译器在进行编译时,与 函数的处理相似,也为类中的变量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同。
未加extern &C&声明时的连接方式
假设在C++中,模块A的头文件如下:
// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x, int y );
  在模块B中引用该函数:
// 模块B实现文件 moduleB.cpp
#include &moduleA.h&
  实际上,在连接阶段,连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号!
加extern &C&声明后的编译和连接方式
加extern &C&声明后,模块A的头文件变为:
// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
extern &C& int foo( int x, int y );
  在模块B的实现文件中仍然调用foo( 2,3 ),其结果是:
(1)模块A编译生成foo的目标代码时,没有对其名字进行特殊处理,采用了C语言的方式;
(2)连接器在为模块B的目标代码寻找foo(2,3)调用时,寻找的是未经修改的符号名_foo。
如果在模块A中函数声明了foo为extern &C&类型,而模块B中包含的是extern int foo( int x, int y ) ,则模块B找不到模块A中的函数;反之亦然。
所以,可以用一句话概括extern “C”这个声明的真实目的(任何语言中的任何语法特性的诞生都不是随意而为的,来源于真实世界的需求驱动。我们在思考问题时,不能只停留在这个语言是怎么 做的,还要问一问它为什么要这么做,动机是什么,这样我们可以更深入地理解许多问题):
实现C++与C及其它语言的混合编程。
明白了C++中extern &C&的设立动机,我们下面来具体分析extern &C&通常的使用技巧。
4.extern &C&的惯用法
  (1)在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理:
extern &C&
#include &cExample.h&
  而在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern &C&声明,在.c文件中包含了extern &C&时会出现编译语法错误。
笔者编写的C++引用C函数例子工程中包含的三个文件的源代码如下:
/* c语言头文件:cExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
/* c语言实现文件:cExample.c */
#include &cExample.h&
int add( int x, int y )
return x +
// c++实现文件,调用add:cppFile.cpp
extern &C&
#include &cExample.h&
int main(int argc, char* argv[])
  如果C++调用一个C语言编写的.DLL时,当包括.DLL的头文件或声明接口函数时,应加extern &C& { }。
(2)在C中引用C++语言中的函数和变量时,C++的头文件需添加extern &C&,但是在C语言中不能直接引用声明了extern &C&的该头文件,应该仅将C文件中将C++中定义的extern &C&函数声明为extern类型。
笔者编写的C引用C++函数例子工程中包含的三个文件的源代码如下:
//C++头文件 cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern &C& int add( int x, int y );
//C++实现文件 cppExample.cpp
#include &cppExample.h&
int add( int x, int y )
return x +
/* C实现文件 cFile.c
/* 这样会编译出错:#include &cExample.h& */
extern int add( int x, int y );
int main( int argc, char* argv[] )
add( 2, 3 );
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:514595次
积分:5827
积分:5827
排名:第3242名
原创:127篇
转载:187篇
评论:40条
(1)(1)(5)(2)(4)(2)(2)(4)(6)(1)(6)(1)(2)(4)(3)(2)(2)(4)(8)(2)(9)(7)(4)(9)(6)(6)(6)(5)(8)(13)(7)(1)(2)(3)(9)(1)(3)(2)(3)(12)(7)(14)(15)(27)(18)(15)(5)(11)(9)(3)(9)(7)

我要回帖

更多关于 帮我看看这块玉 的文章

 

随机推荐