C++数据结构的一个小问题

Yeah天 2017-03-01 10:56:37
一个很简单的大整数求和问题,但是不知道为什么当两个数位数不同输出结果就很奇怪.,
求高手求助

这是头文件:

#ifndef SEQ_LIST_
#define SEQ_LIST_
#include <vector>
using std::vector;

const int MaxSize = 100;
template <class T> class SeqList;
template <class T>
SeqList<T> Add(SeqList<T> A, SeqList<T> B);

template <class T>
class SeqList {
public:
friend SeqList<T> Add<>(SeqList<T> A, SeqList<T> B);
SeqList() { length = 0; }
SeqList(vector<T> v);
~SeqList() {}
int Length() { return length; }
T Get(int i);
int Locate(T x);
void Insert(int i, T x);
T Delete(int i);
void PrintList();
private:
T data[MaxSize];
int length;
};

int max(int m, int n)
{
return m > n ? m : n;
}

template <class T>
SeqList<T> Add(SeqList<T> A, SeqList<T> B)
{
SeqList<T> C;
int flag = 0;
int i = 0;
int n = A.length;
int m = B.length;
while (i < n && i < m) {
C.data[i] = (A.data[i] + B.data[i] + flag) % 10;
flag = (A.data[i] + B.data[i] + flag) / 10;
i++;
}

for (; i < n; i++) {
C.data[i] = (A.data[i] + flag) % 10;
flag = (A.data[i] + flag) / 10;
}

for (; i < m; i++) {
C.data[i] = (A.data[i] + flag) % 10;
flag = (A.data[i] + flag) / 10;
}
C.length = max(m, n) + flag;
if (flag == 1) C.data[C.length - 1] = 1;
cout << "Your output";
for (i = 0; i < C.length; i++)
cout << C.data[i];
cout << endl;
return C;
}

template<class T>
SeqList<T>::SeqList(vector<T> v)
{
if (v.size() > MaxSize) throw "illegal argument";
int i = 0;
for (; i < v.size(); i++)
data[i] = v[i];
length = v.size();
//cout << length << "test";
cout << "Your input";
for (i = 0; i < length; i++)
cout << data[i];
cout << endl;
}

template<class T>
T SeqList<T>::Get(int i)
{
if (i < 1 || i > length) throw "illegal to find data by location";
else return data[i - 1];
}

template<class T>
int SeqList<T>::Locate(T x)
{
for (int i = 0; i < length; i++)
if (data[i] == x) return i + 1;
return 0;
}

template<class T>
void SeqList<T>::Insert(int i, T x)
{
if (length >= MaxSize) throw "overflow";
if (i < 1 || i > length + 1) throw "location";
for (int j = length; j >= i; j--)
data[j] = data[j - 1];
data[i - 1] = x;
length++;
}

template<class T>
T SeqList<T>::Delete(int i)
{
if (length == 0) throw "underflow";
if (i < 1 || i > length) throw "location exception";
int x = data[i - 1];
for (int j = i; j < length; j++)
data[j - 1] = data[j];
length--;
return x;
}

template<class T>
void SeqList<T>::PrintList()
{
for (int i = 0; i < length; i++)
cout << data[i];
cout << endl;
}

#endif





这是源代码:


#include <iostream>
using std::cout;
using std::cin;
using std::endl;
#include <string>
using std::string;
using std::getline;
#include <vector>
using std::vector;

void inVec(vector<int> &v);

int main()
{
vector<int> v1;
vector<int> v2;
cout << "Please enter two big integer: " << endl;
inVec(v1);
inVec(v2);
cout << endl;
SeqList<int> sl1(v1);
SeqList<int> sl2(v2);
cout << endl << "Outcome: " << endl;
SeqList<int> sl3 = Add(sl1, sl2);
cout << "length of sl3: " << sl3.Length() << endl;
sl3.PrintList();

cout << "Buy!" << endl;
}

void inVec(vector<int> &v)
{
string temp;
getline(cin, temp);
auto m = temp.size();
int num;
for (decltype(temp.size()) i = 0; i < m; i++) {
num = temp[i] - 48;
v.push_back(num);
}

}

...全文
185 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yeah天 2017-03-02
  • 打赏
  • 举报
回复
引用 3 楼 sinat_35261315 的回复:
Add函数里面的SeqList<T> A 和 SeqList<T> B能够访问私有成员?
那个我声明为友元函数不是应该可以了么?
Yeah天 2017-03-02
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
仅供参考:
#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char a1[MAXLEN];
char a2[MAXLEN];
static int v1[MAXLEN];
static int v2[MAXLEN];
static int v3[MAXLEN];
int i,j,n,L,z;
void main(void) {
    scanf("%d",&n);
    for (j=0;j<n;j++) {
        scanf("%s%s",a1,a2);

        L=strlen(a1);
        for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';

        L=strlen(a2);
        for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';

        for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];

        for (i=0;i<MAXLEN;i++) {
            if (v3[i]>=10) {
                v3[i+1]+=v3[i]/10;
                v3[i]=v3[i]%10;
            }
        }

        printf("Case %d:\n", j+1);
        printf("%s + %s = ", a1, a2);

        z=0;
        for (i=MAXLEN-1;i>=0;i--) {
            if (z==0) {
                if (v3[i]!=0) {
                    printf("%d",v3[i]);
                    z=1;
                }
            } else {
                printf("%d",v3[i]);
            }
        }
        if (z==0) printf("0");

        printf("\n");
    }
}
//Sample Input
//3
//0 0
//1 2
//112233445566778899 998877665544332211
//
//Sample Output
//Case 1:
//0 + 0 = 0
//Case 2:
//1 + 2 = 3
//Case 3:
//112233445566778899 + 998877665544332211 = 1111111111111111110
谢谢赵老师虽然还是没有相同自己的问题在哪儿
赵4老师 2017-03-02
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char a1[MAXLEN];
char a2[MAXLEN];
static int v1[MAXLEN];
static int v2[MAXLEN];
static int v3[MAXLEN];
int i,j,n,L,z;
void main(void) {
    scanf("%d",&n);
    for (j=0;j<n;j++) {
        scanf("%s%s",a1,a2);

        L=strlen(a1);
        for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';

        L=strlen(a2);
        for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';

        for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];

        for (i=0;i<MAXLEN;i++) {
            if (v3[i]>=10) {
                v3[i+1]+=v3[i]/10;
                v3[i]=v3[i]%10;
            }
        }

        printf("Case %d:\n", j+1);
        printf("%s + %s = ", a1, a2);

        z=0;
        for (i=MAXLEN-1;i>=0;i--) {
            if (z==0) {
                if (v3[i]!=0) {
                    printf("%d",v3[i]);
                    z=1;
                }
            } else {
                printf("%d",v3[i]);
            }
        }
        if (z==0) printf("0");

        printf("\n");
    }
}
//Sample Input
//3
//0 0
//1 2
//112233445566778899 998877665544332211
//
//Sample Output
//Case 1:
//0 + 0 = 0
//Case 2:
//1 + 2 = 3
//Case 3:
//112233445566778899 + 998877665544332211 = 1111111111111111110
The_best_man 2017-03-02
  • 打赏
  • 举报
回复
把iomanip放进去试试
Yeah天 2017-03-02
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
谢谢赵老师的教诲,刚刚入门,学得比较吃力,会慢慢加油的
赵4老师 2017-03-02
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
Yeah天 2017-03-02
  • 打赏
  • 举报
回复
#ifndef SEQ_LIST_ #define SEQ_LIST_ #include <vector> using std::vector; const int MaxSize = 100; template <class T> class SeqList; template <class T> SeqList<T> Add(SeqList<T> A, SeqList<T> B); template <class T> class SeqList { public: friend SeqList<T> Add<>(SeqList<T> A, SeqList<T> B); SeqList() { length = 0; } SeqList(vector<T> v); ~SeqList() {} int Length() { return length; } T Get(int i); int Locate(T x); void Insert(int i, T x); T Delete(int i); void PrintList(); private: T data[MaxSize]; // 每次构造一个顺序表没有将数组初始化,从而导致没有赋值的为是很大的随机负值 // 改为 T data[MaxSize] = {} 才对 int length; }; int max(int m, int n) { return m > n ? m : n; } template <class T> SeqList<T> Add(SeqList<T> A, SeqList<T> B) { SeqList<T> C; int flag = 0; int i = 0; int n = A.length; int m = B.length; while (i < n && i < m) { C.data[i] = (A.data[i] + B.data[i] + flag) % 10; flag = (A.data[i] + B.data[i] + flag) / 10; i++; } for (; i < n; i++) { C.data[i] = (A.data[i] + flag) % 10; flag = (A.data[i] + flag) / 10; } for (; i < m; i++) { C.data[i] = (A.data[i] + flag) % 10; flag = (A.data[i] + flag) / 10; } C.length = max(m, n) + flag; if (flag == 1) C.data[C.length - 1] = 1; cout << "Your output"; for (i = 0; i < C.length; i++) cout << C.data[i]; cout << endl; return C; } template<class T> SeqList<T>::SeqList(vector<T> v) { if (v.size() > MaxSize) throw "illegal argument"; int i = 0; for (; i < v.size(); i++) data[i] = v[i]; length = v.size(); //cout << length << "test"; cout << "Your input"; for (i = 0; i < length; i++) cout << data[i]; cout << endl; } template<class T> T SeqList<T>::Get(int i) { if (i < 1 || i > length) throw "illegal to find data by location"; else return data[i - 1]; } template<class T> int SeqList<T>::Locate(T x) { for (int i = 0; i < length; i++) if (data[i] == x) return i + 1; return 0; } template<class T> void SeqList<T>::Insert(int i, T x) { if (length >= MaxSize) throw "overflow"; if (i < 1 || i > length + 1) throw "location"; for (int j = length; j >= i; j--) data[j] = data[j - 1]; data[i - 1] = x; length++; } template<class T> T SeqList<T>::Delete(int i) { if (length == 0) throw "underflow"; if (i < 1 || i > length) throw "location exception"; int x = data[i - 1]; for (int j = i; j < length; j++) data[j - 1] = data[j]; length--; return x; } template<class T> void SeqList<T>::PrintList() { for (int i = 0; i < length; i++) cout << data[i]; cout << endl; } #endif 这是源代码: #include <iostream> using std::cout; using std::cin; using std::endl; #include <string> using std::string; using std::getline; #include <vector> using std::vector; void inVec(vector<int> &v); int main() { vector<int> v1; vector<int> v2; cout << "Please enter two big integer: " << endl; inVec(v1); inVec(v2); cout << endl; SeqList<int> sl1(v1); SeqList<int> sl2(v2); cout << endl << "Outcome: " << endl; SeqList<int> sl3 = Add(sl1, sl2); cout << "length of sl3: " << sl3.Length() << endl; sl3.PrintList(); cout << "Buy!" << endl; } void inVec(vector<int> &v) { string temp; getline(cin, temp); auto m = temp.size(); int num; for (decltype(temp.size()) i = 0; i < m; i++) { num = temp[i] - 48; v.push_back(num); } } 天哪,经过舍友和我的不懈努力,终于发现问题啦,每次构造一个顺序表没有将数组初始化,从而导致没有赋值的为是很大的随机负值
  • 打赏
  • 举报
回复
估计是短数没有前导0对齐: x4545411 11111111 x是垃圾数据。
ck2333 2017-03-02
  • 打赏
  • 举报
回复
大整数求和,可以参考一下:
#include <stdio.h>
#include <string.h>

void swap(char *a,char *b)  /*交换两数*/
{
	char temp;
	int i;
	for(i=0;i<10000;i++)
	{
		temp=a[i];
		b[i]=a[i];
		a[i]=temp;
	}
}

int main ()
{
	char a[10000],b[10000];
	int i,j,len1,len2,min,max,t,jw=0,temp=0,ans[10001];
	gets(a);//输入第一个数 
	gets(b);//输入第二个数 
	len1=strlen(a);
	len2=strlen(b);
	if(len1>10000||len2>10000)//防止溢出 
		return 0;
	min=len1>len2?len2:len1;
	max=len1>len2?len1:len2;
	t=max-min;
	i=max-1;
	j=min-1;
	if(max==len2)//保证长数为a 
		swap(a,b);
	while(j>=0)//按位运算 
	{
		temp=a[i]-'0'+b[j]-'0'+jw;
		ans[i]=temp%10;
		jw=temp/10;
		i--;
		j--;
	}
	a[t-1]=a[t-1]+jw;
	for(i=0;i<t;i++)//将a中没进行运算的部分复制到ans中 
		ans[i]=a[i]-'0';
	for(i=0;i<max;i++)//输出 
		printf("%d",ans[i]);
	return 0;
}
  • 打赏
  • 举报
回复
Add函数里面的SeqList<T> A 和 SeqList<T> B能够访问私有成员?
Yeah天 2017-03-01
  • 打赏
  • 举报
回复
但是那个整数加法被封装在头文件的函数里面了,我感觉就是那里可能有问题,但是看不出来
幻夢之葉 2017-03-01
  • 打赏
  • 举报
回复
断点调试,一步步查看变量的变化和处理过程

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧