20天集训——day3

今天讲初等数论。我听得一脸懵逼。都只是把模板记住了,概念复习了一边,但还是不会用。

模板:while(n>0)//求n的每位数字
{
 x=n%10; n/=10;
}

int s=0;//统计n的位数
while(n>0)
{
 s++; n/=10;
}

int s=0;//统计n的数字和
while(n>0)
{
 s+=n%10; n/=10;
 }
 
int s=0;//算n的逆序数
while(n>0)
{
 s=s*10+n%10; n/=10;
}
 
int s=0,m=n;//判断n是否为回文数
while(n>0)
{
 s=s*10+n%10; n/=10;
 return s==m;

 
int s=0,m=n;//判断n在b进制下是否为回文数
while (n>0)
{
    s=s*b + n%b; n/=b;
}
return s==m;

今天刷的题比较少。大概只刷了5道题。

进制转换是模板题就是实现两种不同进制之间的数据转换。

#include<bits/stdc++.h>
using namespace std;
char s[110000000]={};
int main()
{
 int n,m,x=1;
 string a;
 long long l=0;
 cin>>n>>a>>m;
 for(int i=0;i<a.size();i++)
 {
  if(a[i]>='0'&&a[i]<='9')
   l=int(a[i]-'0')+l*n;//不高于十
  else  l=l*n+int(a[i]-'A'+10);//高于十
 }
 while(l>0)
 {
  if(l%m<10)
   s[x]=char('0'+l%m);
  else s[x]=char('A'+l%m-10);
  l/=m;
  x++;
 }
 for(int i=x-1;i>=1;i--)
  cout<<s[i];
 return 0;
}

数据统计就是将不同进制的数统计起来,用10进制输出。  就是x进制转10进制+累加。

#include<bits/stdc++.h>
using namespace std;
int main()
{
 int n,a,c[110]={},l=0;
 string b;
 cin>>n;
 for(int i=1;i<=n;i++)
 {
  cin>>a>>b;
     for(int j=0;j<b.size();j++)//转10进制
     {
      if(b[j]>='0'&&b[j]<='9')
       c[i]=c[i]*a+int(b[j]-'0');
      else c[i]=c[i]*a+int(b[j]-'A'+10);
     }
 }
 for(int i=1;i<=n;i++)//累加
  l+=c[i];
 cout<<l<<endl;
}

进制的题还好一点,数论的题超级难。我都要看别人的程序后知道思路了才能打出来。

连续数和是是个数求x个连续正整数之和。看起来很简单,三重循环枚举就好了,但数巨大,一重循环都要超时。

#include<bits/stdc++.h>
using namespace std;
int main()
{
 int n,x,y,a,b;
 bool t=1;
 cin>>n;
 for(int i=sqrt(1.0*2*n);i>=2;i--)
 {
  if((2*n)%i==0)
  {
   y=i;
   x=(2*n)/i;
  
  if((x+y-1)%2==0)//两数比为一奇一偶,如此x-y比为奇数
  {
   b=(x+y-1)/2;//由(a+b)和(a-b+1)可得,即x,y;
   a=x-b;
   if(a<=0||b<=0) continue;//没有负数
   t=0;
   for(int j=a;j<b;j++)
    cout<<j<<' ';
   cout<<b<<endl;
  }
     }
 }
 if(t)
  cout<<"NONE";
}



猜你喜欢

转载自blog.csdn.net/wangzhuojia/article/details/80945129