c++编程基础的一些基础知识及误区和方法

版权声明:如要转载,请注明出处,谢谢 https://blog.csdn.net/yezonghui/article/details/78897525

1. 记一次ACM系统不让过事件:说到底其实还是自己代码问题,自己没有考虑到位,然后编程时没有顾忌到边边角角问题。

   Eg:题目大意就算当输入的两个数是0时,表示输入结束。然后我使用

While((cin>>m)!=0&&(cin>>n)!=0)归根结底还是基础概念不清晰:&&表示与,然后1&1=11&0=0.所以按照我上面这么写就会导致当m,n中其中有一个0时也会满足为0而结束。因此我们需要把&&换成||。后来亲自实验发现这样错的更远。 while((cin>>n)||(cin>>m))正如离散数学里面讲的,当判断到cin>>n不是0后,后面的m就直接输不进去了,因为前面已经是真的了。

    解决办法:

 while(1)
              {
    	        cin>>n>>m;
    	        if(m==0&&n==0)break;
    	        Else
}


2. 解决数字拼接得最大问题。

   Eg:题目大意就是给两个数,怎么连接得到的最大,比如123 45.我们拼接后最大为45123.

我的思路,用字符串结合冒泡法进行一下排序,从大到小排完序后,用+进行字符串连接就行,结果自己测了好几组数据都能过,但是提交就是过不了。后来发现还是自己考虑不够全面,例如772.我们要是按照我的思路就是727,但是最大的应该是772.因此要换一种方法,每次比的是两次连接后的字符串,这样问题就全部解决了。(即if(str[j]+str[j+1]<str[j+1]+str[j])

完整题目见下面:

/*设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。
例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213
又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613
输入
第一行,一个正整数n。
第二行,n个正整数。
输出
一个正整数,表示最大的整数
样例输入1
3
13 312 343
样例输出1
34331213*/
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,i,j,a[1000]={0};
string str[100];
cin>>n;
for(i=0;i<n;i++)
{
cin>>str[i];
}
//	sort(str,str+n,greater<string>()) ;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
//if(str[j]+str[j+1]<str[j+1]+str[j])
if(str[j]<str[j+1])  //为什么这样不行。
{//终于找到错误了,因为7,76,应该是776而不是767.
swap(str[j],str[j+1]);//还是由于自己考虑不全面,以后例子要尽量举不同类型的。
}
}
}*
for(i=0;i<n;i++)
{
cout<<str[i];
}
return 0;
 }


通过这道题目还掌握了一点:原理字符串数组也能直接sort()进行排序。开心,以后又省事了。sort(str,str+n,greater<string>()) ;这样就行。

扫描二维码关注公众号,回复: 6113244 查看本文章


3. 是否包含子字符串(猴子打字)

if(str2.find(str[i])!=string::npos)         指的是str2字符串里面是否包含str字符串

返回一个名为 string::npos 的特殊值,说明查找没有匹配。string 类将 npos 定义为保证大于任何有效下标的值。

 

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int t,n,i,j;
string str[102],str2;
cin>>t;
while(t--)
{
cin>>n;
for(i=0;i<n;i++)
{
cin>>str[i];
}
cin>>str2;
int sum=0;
for(i=0;i<n;i++)
{
if(str2.find(str[i])!=string::npos)
{
sum++;
}
}
cout<<sum<<endl;
 }
 return 0;
}


4. 大小写字母  tasnsform

//查找最大字符

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int i;
string str,strb;
while((cin>>str))
{
strb=str;
transform(str.begin(),str.end(),str.begin(),::toupper);
//cout<<str<<endl;
char temp='0';
for(i=0;i<str.length();i++)
{
if(temp<str[i])
{
temp=str[i];
}
}
for(i=0;i<str.length();i++)
{
if(str[i]==temp)
{
cout<<strb[i];
cout<<"(max)";
//strb[i]+="max";
}
else
{
cout<<strb[i];
}
 }
 cout<<endl;
}
//cin>>strA;//通过STL的transform算法配合的toupper和tolower来实现该功能
// transform(strA.begin(), strA.end(), strA.begin(), ::toupper); 
//str1=str1+"max";
//cout<<strb;
return 0;
 }


 //好好总结transform

总结:

 利用transform和tolower及toupper进行结合然后运用

transform(str.begin(),str.end(),str.begin(),::toupper);格式进行大小写转换。

5. 总结swap乱用后果,本来就是赋值,何必装逼;也就是在一些编程中我们无意中交换数值i,反而会导致一些不必要的后果,(比如说后续还会继续使用被交换的值时。)因此我们可以尽量采用直接赋值就行,不必多次一举

6. 被除数时大整数的除法。

(除数是一般的int数)

#include<bits/stdc++.h>
using namespace  std;
int chufa(string a,int b)
{
int a2[1005];
int len=a.length();
int temp=0,begining=0,i;
for(i=0;i<len;i++)
{
a2[i]=(temp*10+a[i]-'0')/b;
temp=(temp*10+a[i]-'0')%b;
}
for(i=0;i<len;i++)
{
if(a2[i]!=0)
{
begining=i;
break;
}
}
for(i=begining;i<len;i++)
{
cout<<a2[i];
}
cout<<" "<<temp;
}
int main()
{
string a,q;
int b,r,i,j;
cin>>a>>b;
chufa(a,b);
 }


思路:被除数使用字符串输入,然后转换成数字数组。进行计算是我们用被除数的每一位除以除数,然后记录到另一个数字数组,接下来为下一个被除数单个数字进行准备:也就是把前一个求余乘以10+此时这个数,怎样就准备好了。。(最后的一次计算余数就是总的余数


7.这个是我目前为止了解求素数用时最短的方法。(之前的方法一般就是计算这个数是否能被2到根号下这个数整除);。。这里我们的思路就是2是素数已经定了;-》然后偶数直接跳过,因此每次直接加2,往后推-》后面直接把素数所有倍数标记为非素数。

#include <stdio.h>
#include <string.h>
#define MAX 110
int main()
{
int a[MAX]={0};
memset(a, 0, MAX);
int i, j, count = 1;
a[1] = 2;
for(i = 3; i < MAX; i += 2)
{
   if(a[i] == 0)
{
count++;
a[count] = i;
for(j = i + i; j < MAX; j += i)
{
a[j] = 1;
}
}
}
return 0;
}


//这个方法要强化记忆。不然对于一些大的测试点我们就过不了。


猜你喜欢

转载自blog.csdn.net/yezonghui/article/details/78897525