@orangelee-666
2019-12-15T12:03:35.000000Z
字数 8180
阅读 366
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );
istream& getline (istream& is, string& str, char delim);
istream& getline (istream&& is, string& str, char delim);
istream& getline (istream& is, string& str);
istream& getline (istream&& is, string& str);
cin >> namel;
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
string city;
cout << "Please enter your name: ";
cin >> name;
cout << "Enter the city you live in: ";
cin >> city;
cout << "Hello, " << name << endl;
cout << "You live in " << city << endl;
return 0;
}
而结果呢,是这样的
Please enter your name: John Doe
Enter the city you live in: Hello, John
You live in Doe
所以说虽然可以使用 cin 和 >> 运算符来输入字符串,但它可能会导致一些需要注意的问题:当 cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格、制表符或换行符)。一旦它接触到第一个非空格字符即开始阅读,当它读取到下一个空白字符时,它将停止读取
而在这个示例中,用户根本没有机会输入 city 城市名。因为在第一个输入语句中,当 cin 读取到 John 和 Doe 之间的空格时,它就会停止阅读,只存储John作为name的值。在第二个输入语句中,cin使用键盘缓冲区中找到的剩余字符,并存储 Doe 作为 city 的值。
getline(cin, inputLine);
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
string city;
cout << "Please enter your name: ";
getline(cin, name);
cout << "Enter the city you live in: ";
getline(cin, city);
cout << "Hello, " << name << endl;
cout << "You live in " << city << endl;
return 0;
}
输出结果
Please enter your name: John Doe
Enter the city you live in: Chicago
Hello, John Doe
You live in Chicago
总时间限制: 1000ms 内存限制: 65536kB
求两个不超过200位的非负整数的和。
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
22222222222222222222
33333333333333333333
55555555555555555555
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
char a[205]={0},b[205]={0};
int d[205]={0},f[205]={0},e[205]={0},c,l=0;
int l1,l2;
gets(a);
gets(b);
l1=strlen(a);
l2=strlen(b);
for(c=0;c<l1;c++)
{
d[205-l1+c]=a[c]-'0';
}
for(c=0;c<l2;c++)
{
f[205-l2+c]=b[c]-'0';
}
c=205;
while(c--)
{
e[c]+=d[c]+f[c];
if(e[c]>=10)
{
e[c-1]++;
e[c]=e[c]%10;
}
}
for(c=0;c<205;c++)
{
if(e[c]!=0)
break;
}
for( c;c<205;c++)
l+=printf("%d",e[c]);
if(l==0)
printf("0");
return 0;
}
总时间限制: 1000ms 内存限制: 65536kB
求两个大的正整数相减的差。
共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。
一行,即所求的差。
9999999999999999999999999999999999999
9999999999999
9999999999999999999999990000000000000
#include<cstdio>
#include<cstring>
#define m 220
int x[m],y[m];
char b[m],c[m];
int i,s,r,t,z;
int main()
{
scanf("%s%s",b,c);
s=strlen(b);
r=strlen(c);
if(s>r) t=s;
else t=r;
for(int i=0;i<s;i++) x[i]=b[s-i-1]-'0';
for(int i=0;i<r;i++) y[i]=c[r-i-1]-'0';
for(int i=0;i<t;i++)
{
x[i]-=y[i];
if(x[i]<0)
{
x[i+1]--;
x[i]+=10;
}
}
int z=t;
while(x[z]==0&&z!=0)
{
z--;
}
for(int i=z;i>=0;i--)
{
printf("%d",x[i]);
}
return 0;
}
总时间限制: 1000ms 内存限制: 65536kB
求两个不超过200位的非负整数的积。
有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
12345678900
98765432100
1219326311126352690000
#include<cstdio>
#include<cstring>
#include<cmath>
#define m 500
using namespace std;
int x[m],y[m], z[m];
char b[m],c[m];
int main()
{
int len1, len2, len3;
scanf("%s%s", b, c);
len1=strlen(b);
len2=strlen(c);
for(int i=0; i<len1; i++)
x[i] = b[len1-1-i]-'0';
for(int i=0; i<len2; i++)
y[i] = c[len2-1-i]-'0';
for(int i=0; i<len1; i++)
{
for(int j=0; j<len2; j++)
z[i+j]+=x[i]*y[j];
len3 = len1+len2;
}
for(int i=0; i<=len3; i++)
{
if(z[i]>=10)
{
z[i+1]+=z[i]/10;
z[i]%=10;
}
}
while(z[len3-1]==0 && len3>1) len3--;
for(int i=len3-1; i>=0; i--)
{
printf("%d", z[i]);
}
return 0;
}
输入两个整数a,b,输出它们的商(a<=10^5000,b<=10^9)
两行,第一行是被除数,第二行是除数。
一行,商的整数部分
10
2
5
#include<cstdio>
#include <cstring>
using namespace std;
int a[10000];
int y;
int l=0;
int yushu;
int shang;
int f=0;
int main()
{
char c=getchar();
while (c>='0' && c<='9')
{
l++;
a[l]=(c-'0');
c=getchar();
}
//scanf("%s",a);
//l=strlen(a);
scanf("%d",&y);
for (int i=1;i<=l;i++)
{
yushu=a[i]%y;//第i位的余数
shang=a[i]/y;//第i位的商
a[i]=shang;
a[i+1]+=yushu*10;//把余数弄到下一位
}
for (int i=1;i<=l;i++)
{
if (f==0 && a[i]>0) f=1;
if (f==1) printf("%d",a[i]);
}
return 0;
}
输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
n(1≤n≤9)
由1~n组成的所有不重复的数字序列,每行一个序列。每个数字保留5个场宽。
3
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n, m=0;
int a[10];
bool vis[25];
void q()
{
if(m==n)
{
for(int i=0; i<n; i++) printf("%5d", a[i]);
printf("\n");
}
for(int i=1; i<=n; i++)
{
if(vis[i]==0)
{
vis[i]=1;
a[m++]=i;
q();
m--;
vis[i]=0;
}
}
}
int main()
{
scanf("%d", &n);
q();
return 0;
}
定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”。
当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性”。
我们常用大O表示法表示时间复杂性,注意它是某一个算法的时间复杂性。大O表示只是说有上界,由定义如果f(n)=O(n),那显然成立f(n)=O(n^2),它给你一个上界,但并不是上确界,但人们在表示的时候一般都习惯表示前者。
此外,一个问题本身也有它的复杂性,如果某个算法的复杂性到达了这个问题复杂性的下界,那就称这样的算法是最佳算法。
“大O记法”:在这种描述中使用的基本参数是n,即问题实例的规模,把复杂性或运行时间表达为n的函数。这里的“O”表示量级 (order),比如说“二分检索是 O(logn)的”,也就是说它需要“通过logn量级的步骤去检索一个规模为n的数组”记法 O ( f(n) )表示当 n增大时,运行时间至多将以正比于 f(n)的速度增长。
常见的时间复杂度
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
{
for(k=0;k<j;k++)
x=x+2;
}
}
那我们可以看到,代码中出现了三层循环,那么我们可以认为它的时间复杂度为
当i=m,j=k的时候,内层循环的次数为k
当i=m时,j可以取
所以这里最内循环共进行了次
所以,i从0取到n, 则循环共进行了:
所以时间复杂度为
平时听到某些大佬口中的是什么呢?
temp=i;i=j;j=temp;
遇到这样的语句,我们可能会听到“使用查询。。。”之类的话语。实际上与n无关,只是在执行语句。
当然,在一些场合,你可能会听到频度这个词。那频度又是什么?(很明显我前面忘说了)
还是来看一下标准定义
一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为。
其实我也没太看懂
for (i=1;i<n;i++) {
y=y+1; ①
for(j=0;j<=(2*n);j++) {
x++; } ②
}
像这样,代码中语句①的频度是
语句②的频度是
(f(n)上面提到了)
该程序的时间复杂度
i=1; ①
while (i<=n)
i=i*2; ②
语句①的频度是1
到这里,又卡住了,语句②是什么鬼。。。(我也不知道)
那我们可以设语句②的频度是, 则:;
取最大值,
一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数,因此,算法的时间复杂度记做:。随着模块n的增大,算法执行的时间的增长率和的增长率成正比,所以越小,算法的时间复杂度越低,算法的效率越高。
在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出的同数量级(它的同数量级有以下:),找出后,,若求极限可得到一常数c,则时间复杂度。
今天模拟,想调用<cmath>中的函数,然鹅。。。突然忘了,所以还是总结一下吧
写法 | 作用 |
---|---|
int abs(int i) | 返回整型参数i的绝对值 |
double fabs(double x) | 返回双精度参数x的绝对值 |
long labs(long n) | 返回长整型参数n的绝对值 |
double exp(double x) | 返回指数函数e^x的值 |
double log(double x) | 返回logex的值 |
double log10(double x) | 返回log10x的值 |
double pow(double x,double y) | 返回x^y的值 |
double pow10(int p) | 返回10^p的值 |
double sqrt(double x) | 返回+√x的值 |
double acos(double x) | 返回x的反余弦arccos(x)值,x为弧度 |
double asin(double x) | 返回x的反正弦arcsin(x)值,x为弧度 |
double atan(double x) | 返回x的反正切arctan(x)值,x为弧度 |
double cos(double x) | 返回x的余弦cos(x)值,x为弧度 |
double sin(double x) | 返回x的正弦sin(x)值,x为弧度 |
double tan(double x) | 返回x的正切tan(x)值,x为弧度 |
double hypot(double x,double y) | 返回直角三角形斜边的长度(z),x和y为直角边的长度,z^2=x^2+y^2 |
double ceil(double x) | 返回不小于x的最小整数 |
double floor(double x) | 返回不大于x的最大整数 |
int rand() | 产生一个随机数并返回这个数 |
double atof(char *nptr) | 将字符串nptr转换成浮点数并返回这个浮点数 |
double atol(char *nptr) | 将字符串nptr转换成长整数并返回这个整数 |
double atof(char *nptr) | 将字符串nptr转换成双精度数,并返回这个数,错误返回0 |
int atoi(char *nptr) | 将字符串nptr转换成整型数, 并返回这个数,错误返回0 |
long atol(char *nptr) | 将字符串nptr转换成长整型数,并返回这个数,错误返回0 |