思考题一
int main()
{
int n;
int i;
int num = 1;
printf("输入天数:n=");
scanf("%d", &n);
for (i = 0;i < n; i++)
{
num = (num + 1) * 2;
}
printf("%d", num);
}
T(n)=O(n)
思考题二
int Gcd(int a, int b)
{
int r;
r = a % b;
while (r)
{
a = b;
b = r;
r = a % b;
}
return b;
}
void Memory_move(int n, int k, int a[6])
{
int temp,p;
int q = Gcd(n, k);
for (int i = 0;i < q;i++)
{
p = i;
temp = a[p];
printf("%d\n", temp);
for (int j = 0;j < n / q-1;j++)
{
a[p] = a[(p+k)%n];
p = (p + k) % n;
}
a[p] = temp;
}
for (int i = 0;i < n;i++)
printf("%d", a[i]);
}
int main()
{
int n = 6, k = 2;
int a[6] = {0,1,2,3,4,5};
Memory_move(n, k, a);
}
思考题三
如何优化?
将每次循环的最后一个要移动的数a[p]存在temp中,然后将前一个数a[(-k)modn]移动到a[p]位置,循环完成
void Memory_move(int n, int k, int a[6])
{
int temp,p;
int q = Gcd(n, k);
for (int i = 0;i < q;i++)
{
p = i;
for (int j = 0;j < n / q-1;j++)
{
p =(p+k)%n;
}
temp = a[p];
for (int j = 0;j < n / q;j++)
{
a[p] = a[(p-k)%n];
p = (p - k) % n;
}
a[i] = temp;
}
for (int i = 0;i < n;i++)
printf("%d", a[i]);
}
思考题四
void func(int x[], int y[])
{
int n_1 = sizeof(x) / sizeof(int);
int n_2 = sizeof(y) / sizeof(int);
int b,temp,n;
int num[10] = {0};
int i, j;
int temp_1 = 1;
for (i = 0;i <n_2;i++)
{
for (b = y[i];b != 0;b = b/10)
{
n = b % 10;
int d = 0;
temp = 0;
for (j = 0;j <n_1;j++)
{
temp = x[j] * n*temp_1 + d;
num[i + j] = temp % 1000000+num[i+j];
d = temp / 1000000;
}
temp_1 *= 10;
}
printf("!");
}
for (i = 0;i < sizeof(num) / sizeof(int);i++)
printf("%d\n", num[i]);
}
或
#include<iostream>
#include<string>
using namespace std;
//移位进位法
string Mul(string left, string right)
{
size_t Lsize = left.size(); //size_t = unsigned int
size_t Rsize = right.size();
size_t Size = Lsize + Rsize; //最长位数
string res(Size, '0');
int takevoer = 0;//进位
int offset = 0;//移位
size_t idx = 1, j = 1;
for (idx = 1; idx <= Rsize; ++idx)
{
takevoer = 0;
int rightnum = right[Rsize - idx] - '0';
//计算每一位与left相乘
for (j = 1; j <= Lsize; ++j)
{
char resBit = res[Size - j - offset] - '0'; //取res存储对应位的数字
int num = rightnum * (left[Lsize - j] - '0') + takevoer + resBit;//将两个数相乘,将进位和数组内存的数加入
takevoer = num / 10;
res[Size - j - offset] = num % 10 + '0'; //先把个位存进去
}
if (takevoer != 0)
res[Size - j - offset] = takevoer + '0';
offset++;
}
//如果没有进位的话,res最高位没有数字
if (res[0] == '0')
res.erase(0, 1);
return res;
}
int main()
{
string s1, s2;
cin >>s1 >> s2;
string str=Mul(s1,s2);
cout << str << endl;
}