北京大学ACM 1001心得(1)——大数加算
もしこの数日偶然自分の解答の記録をめくってみるならば、私はもう少しで自分の最も基礎的な1001が意外にも忘れてしたことを忘れるところで、本当に罪です.そこで時間をかけてこの問題を解いた.効率的な時間はまあまあです.
ブロガーはコードを書く習慣がありますが、コードを書くのが好きです.他の人が読めないのではないかと心配しています.実際、個人的には、コードを簡素化するのは良いが、コードの長さを効果的に削減することができ、大きなセグメントのコードクリップよりも効率的である可能性があると思います.しかし、学习の段阶で、私は最も重要なのはやはり多く使ったほうがいいと思って、多く考えて、多く考えて、多くC++の中で各种のコードの运用を学びます.だから私のコードはとても長いですが、私のコードは絶対に理解しやすいと信じています.そして、修正しやすいです.
北京大学ACMの問題集はとてもおもしろくて、1000題はプログラミングに対してある程度理解することができるのでさえすれば、すべて作ることができて、しかし1001、1002のすぐ続くこの2つの問題は本当に人をかわいがらせます.主に基礎部分に置いて、私は難易度あるいは考察の思想と内容がすでに2000難易度ぐらいだと感じて、私はACM問題庫が人を退却させる主なのはやはりこの2つの問題だと思って、恐ろしい30ぐらいの通過率、本当に人に引き続きする意欲を忘れさせました.
ここのブロガーは1日かけて、ACM 1001のいくつかの内在的な内容を深く掘り下げて、いくつかの心得を構成して、今日はその中の1編の大数の加算です.
大数加算はすべてのデータ演算の基礎と言える.乗算実加算に基づいて得られる.だから大数加算は校正に頼る良い方法です.十進法の大数加算だけでなく、様々な進数も含まれていますが、その内在的なつながりを明らかにすればいいです.どの進数も手で捕まえたと言える.
以下に貼る大数加算コードは最も基礎的な演算の角度から、皆さんにレンガを提供しました.コードは以下のように必要な注釈をした.
ここで理解すれば、その中のいくつかの進数を表す量を他の進数に変えることができ、様々な進数の大数加算を簡単に得ることができます.ここのブロガーはコードを貼らない.
また、C++でstringとchar*が連動するのは便利ですが、char*は最終的に終端子の定義を必要とします.そうしないと、意外なことが起こります.次のテストコードを見てください
ここに追加しなければなりません
ブロガーはコードを書く習慣がありますが、コードを書くのが好きです.他の人が読めないのではないかと心配しています.実際、個人的には、コードを簡素化するのは良いが、コードの長さを効果的に削減することができ、大きなセグメントのコードクリップよりも効率的である可能性があると思います.しかし、学习の段阶で、私は最も重要なのはやはり多く使ったほうがいいと思って、多く考えて、多く考えて、多くC++の中で各种のコードの运用を学びます.だから私のコードはとても長いですが、私のコードは絶対に理解しやすいと信じています.そして、修正しやすいです.
北京大学ACMの問題集はとてもおもしろくて、1000題はプログラミングに対してある程度理解することができるのでさえすれば、すべて作ることができて、しかし1001、1002のすぐ続くこの2つの問題は本当に人をかわいがらせます.主に基礎部分に置いて、私は難易度あるいは考察の思想と内容がすでに2000難易度ぐらいだと感じて、私はACM問題庫が人を退却させる主なのはやはりこの2つの問題だと思って、恐ろしい30ぐらいの通過率、本当に人に引き続きする意欲を忘れさせました.
ここのブロガーは1日かけて、ACM 1001のいくつかの内在的な内容を深く掘り下げて、いくつかの心得を構成して、今日はその中の1編の大数の加算です.
大数加算はすべてのデータ演算の基礎と言える.乗算実加算に基づいて得られる.だから大数加算は校正に頼る良い方法です.十進法の大数加算だけでなく、様々な進数も含まれていますが、その内在的なつながりを明らかにすればいいです.どの進数も手で捕まえたと言える.
以下に貼る大数加算コードは最も基礎的な演算の角度から、皆さんにレンガを提供しました.コードは以下のように必要な注釈をした.
// , , , , addflag
char* addbig(string a, string b)
{
string start("0");
int m = a.length();
int n = b.length();
string c;
int temp;
if (m < n)
{
c = a;
a = b;
b = c;
temp = m;
m = n;
n = temp;
}// a
a = start + a;
int i, j = 0;
int addflag = 0;
char *res = new char[m + 2];
res[m + 1] = '\0';
for (i = m, j = n - 1; i >= 0; i--)
{
if (j < 0) temp = (a[i] - 48) + addflag;
else temp = ((a[i] - 48) + (b[j] - 48)) + addflag; // , ,
// 9+9 = 18, 1,
addflag = temp / 10;
res[i] = temp % 10 + 48;
j--;
}
if (res[0] == 48)
{
for (i = 0; i < m; i++)
{
res[i] = res[i + 1];
}
res[i] = '\0';
}// , , 。
return res;
delete[]res;
res = NULL;
}
int main()
{
char a[10];
char b[10];
cin >> a >> b;
char *c;
c = addbig(a, b);
cout << c;
system("pause");
return 0;
}
ここで理解すれば、その中のいくつかの進数を表す量を他の進数に変えることができ、様々な進数の大数加算を簡単に得ることができます.ここのブロガーはコードを貼らない.
また、C++でstringとchar*が連動するのは便利ですが、char*は最終的に終端子の定義を必要とします.そうしないと、意外なことが起こります.次のテストコードを見てください
#include
#include
using namespace std;
int main()
{
char *a = "Hello";
char *b = new char[10];
for (int i = 0; i < 5; i++)
{
b[i] = 'a';
}
string str1 = a;
string str2 = b;
cout << "a length" << str1.length() << endl;
cout << "b length" << str2.length() << endl;
system("pause");
return 0;
}
多くの人がb[i]という付与方式を好んで使っており、システムが処理するときにaのように自動的に「0」をつけたいと思っているが、実際にはそうではなく、それから伝達するときに大きな問題が発生する.ここに追加しなければなりません
b[5] = '\0';
が正常に結果を得ることができるので、皆さんが使っている学生は注意してください.char*、stringの連動は便利ですが、この便利さはあなたが心を込めて使う必要があります.