C++ C++;程序仅在打印数字时有效
我正在写一个程序,可以计算出两个大于无符号long的幂。基本上,我希望程序运行,然后在最后显示数字,但只有在每次乘以2后显示数字时,程序才起作用。以下是工作方式的代码:C++ C++;程序仅在打印数字时有效,c++,C++,我正在写一个程序,可以计算出两个大于无符号long的幂。基本上,我希望程序运行,然后在最后显示数字,但只有在每次乘以2后显示数字时,程序才起作用。以下是工作方式的代码: #include <iostream> #include <stdio.h> #include <climits> using namespace std; class big { public: short container[SHRT_MAX]; void print(
#include <iostream>
#include <stdio.h>
#include <climits>
using namespace std;
class big {
public:
short container[SHRT_MAX];
void print() {
digits();
for (; length != 0; length --) {
cout << container[length - 1];
}
cout << "\n";
}
unsigned int digits() {
if (!length) {
for (length = 0; ; length++) {
if (container[length] == '\0' &&container[length + 1] == '\0' && container[length + 2] == '\0' && container[length + 3] == '\0' && container[length + 4] == '\0') break;
}
}
return length;
}
private:
unsigned int length;
};
int numDigits(int number)
{
int digits = 0;
if (number < 0) digits = 1;
while (number) {
number /= 10;
digits++;
}
return digits;
}
int main(int argc, const char * argv[])
{
big result;
unsigned short tempResult;
unsigned short carry = 0;
result.container[0] = 1;
for (int i = 0; i < 65536; i++) {
cout << "[" << i+1 << "]\t";
if (i < 9) {
cout << "\t";
}
carry = 0;
unsigned int length = result.digits();
for (int k = 0; k < length; k++) {
tempResult = result.container[k] * 2 + carry;
carry = 0;
if (numDigits(tempResult) == 2) {
carry = 1;
result.container[k] = tempResult - 10;
if (!result.container[k+1] && !result.container[k+2] && !result.container[k+3] && !result.container[k+4]) {
result.container[k+1] += carry;
}
}
else {
result.container[k] = tempResult;
}
}
result.print();
}
}
#包括
#包括
#包括
使用名称空间std;
班级大{
公众:
短容器[SHRT_MAX];
作废打印(){
数字();
对于(;长度!=0;长度--){
cout在构造“大”对象的过程中,您的成员是默认初始化的,而不是值初始化的。因此,当您调用digits()
计算长度时,该数组中的任何垃圾和长度都将被当作有效的
将以下内容添加到大类中:
big() : length(0) { memset(container, 0, sizeof(container)); }
即使如此,计算结果仍存在堆栈溢出问题。这是:
if (!result.container[k+1] && !result.container[k+2] && !result.container[k+3] && !result.container[k+4]) {
result.container[k+1] += carry;
几乎可以保证超出您的有限数字容器,使其具有足够大的长度
(而且不会花费太多时间)
实际上,您在这个类中完成了一半的工作,一半的工作是在代码中直接修改这个类的成员。并且几乎违反了人们所能想到的所有OOP咒语。坦率地说,这非常需要重新设计
示例输出(我将其限制为128个条目)
您的print()
和digits()
只能一起工作
digits()
仅当长度为零时才计算新的长度。否则它什么也不做。
每次迭代时,在编写位置的print()
函数使length
等于0
当您移出打印时,length
在下一次迭代中不等于0
,因此长度保持不变(第一次迭代后为1)
实际上写print()不是一个好主意
这种方式。这意味着你只能打印一次数字。你应该使用一个局部变量。好的,我不会说这是我的最终解决方案,因为我仍然不知道为什么会这样,但是当我将result.length设置为0时,我可以在循环之外打印最终解决方案。下面是代码:
#include <iostream>
#include <stdio.h>
#include <climits>
using namespace std;
class big {
public:
short container[SHRT_MAX];
void print() {
digits();
for (; length != 0; length --) {
cout << container[length - 1];
}
cout << "\n";
}
void resetLength() {
length = 0;
}
unsigned int digits() {
length = 0;
for (length = 0; ; length++) {
if (container[length] == '\0' &&container[length + 1] == '\0' && container[length + 2] == '\0' && container[length + 3] == '\0' && container[length + 4] == '\0') break;
}
return length;
}
big() : length(0) { memset(container, 0, sizeof(container)); }
private:
unsigned int length;
};
int numDigits(int number)
{
int digits = 0;
if (number < 0) digits = 1;
while (number) {
number /= 10;
digits++;
}
return digits;
}
int main(int argc, const char * argv[])
{
big result;
unsigned short tempResult;
unsigned short carry = 0;
result.container[0] = 1;
for (unsigned int i = 0; i < 65536; i++) {
/*cout << "[" << i+1 << "]\t";
if (i < 9) {
cout << "\t";
}*/
carry = 0;
unsigned int length = result.digits();
for (int k = 0; k < length; k++) {
tempResult = result.container[k] * 2 + carry;
carry = 0;
if (numDigits(tempResult) == 2) {
carry = 1;
result.container[k] = tempResult - 10;
if (!result.container[k+1] && !result.container[k+2] && !result.container[k+3] && !result.container[k+4]) {
result.container[k+1] += carry;
}
}
else {
result.container[k] = tempResult;
}
}
result.resetLength();
}
result.print();
}
#包括
#包括
#包括
使用名称空间std;
班级大{
公众:
短容器[SHRT_MAX];
作废打印(){
数字();
对于(;长度!=0;长度--){
cout(int i=0;i<65536;i++)
使用unsigned i
@GrijeshChauhan如果sizeof(int)=2
就可以了,但据我所知,sizeof(int)
应该与处理器字相同(我们这个时候至少4个),请添加插入print()的位置
@Alex最后我想移动result.print()就在最后一个支架的正上方,因此它完全超出了大范围loop@GrijeshChauhan我尝试了unsigned int I,它没有改变任何东西,但是如果我的容器数组足够大,可以计算2^65536,那么它为什么会溢出?对新的组织技术有什么想法吗?@InsertNameHere,因为length
没有初始化任何一个
#include <iostream>
#include <stdio.h>
#include <climits>
using namespace std;
class big {
public:
short container[SHRT_MAX];
void print() {
digits();
for (; length != 0; length --) {
cout << container[length - 1];
}
cout << "\n";
}
void resetLength() {
length = 0;
}
unsigned int digits() {
length = 0;
for (length = 0; ; length++) {
if (container[length] == '\0' &&container[length + 1] == '\0' && container[length + 2] == '\0' && container[length + 3] == '\0' && container[length + 4] == '\0') break;
}
return length;
}
big() : length(0) { memset(container, 0, sizeof(container)); }
private:
unsigned int length;
};
int numDigits(int number)
{
int digits = 0;
if (number < 0) digits = 1;
while (number) {
number /= 10;
digits++;
}
return digits;
}
int main(int argc, const char * argv[])
{
big result;
unsigned short tempResult;
unsigned short carry = 0;
result.container[0] = 1;
for (unsigned int i = 0; i < 65536; i++) {
/*cout << "[" << i+1 << "]\t";
if (i < 9) {
cout << "\t";
}*/
carry = 0;
unsigned int length = result.digits();
for (int k = 0; k < length; k++) {
tempResult = result.container[k] * 2 + carry;
carry = 0;
if (numDigits(tempResult) == 2) {
carry = 1;
result.container[k] = tempResult - 10;
if (!result.container[k+1] && !result.container[k+2] && !result.container[k+3] && !result.container[k+4]) {
result.container[k+1] += carry;
}
}
else {
result.container[k] = tempResult;
}
}
result.resetLength();
}
result.print();
}