小团最近对逆序数(将一个数字逐位逆序,例如1234的逆序数为4321,1100的逆序数为11)特别感兴趣,但是又觉得普通的逆序数问题有点太乏味了。
于是他想出了一个新的定义:如果一个数的4倍恰好是它的逆序数,那么称这两个数是新定义下的逆序对。
接下来给定一正整数n,问:不超过n的正整数中有多少对新定义下的逆序对?
小团最近对逆序数(将一个数字逐位逆序,例如1234的逆序数为4321,1100的逆序数为11)特别感兴趣,但是又觉得普通的逆序数问题有点太乏味了。
于是他想出了一个新的定义:如果一个数的4倍恰好是它的逆序数,那么称这两个数是新定义下的逆序对。
接下来给定一正整数n,问:不超过n的正整数中有多少对新定义下的逆序对?
单组输入。
输入一个正整数n,n<1e7。
第一行输出在不超过n的前提下有多少对逆序数,接下来每一行输出一对逆序数,以空格分隔。如果有多组逆序数,按照第一个数升序输出。
如果没有一对逆序数则直接输出0即可。
10000
1 2178 8712
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.ArrayList; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine().trim()); if(n < 2178){ System.out.println(0); }else{ int num = 2178; int count = 0; ArrayList<String> res = new ArrayList<>(); while(num <= n / 4){ int revNum = reverse(num); if(4*num == revNum){ count ++; res.add(num + " " + revNum); } num ++; } System.out.println(count); for(int i = 0; i < res.size(); i++) System.out.println(res.get(i)); } } // 对数字num进行逆序 private static int reverse(int num){ int res = 0; while(num > 0){ res = res*10 + num%10; num /= 10; } return res; } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Main { public static void main(String[] args) throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); int n=Integer.parseInt(br.readLine().trim())/4; List<int[]> list=new ArrayList<>(); for (int i = 1; i <= n; i++) { int ren=Integer.parseInt(new StringBuilder().append(i).reverse().toString()); if (i*4==ren){ list.add(new int[]{i,ren}); } } System.out.println(list.size()); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)[0]+" "+list.get(i)[1]); } } }
链接:https://www.nowcoder.com/questionTerminal/b7536a2ffb1947e4930d12ece2f838b4?f=discussion 来源:牛客网 #include<bits/stdc++.h> using namespace std; vector<string> path; bool check(int a,int b) { string tmp1=to_string(a); string tmp2=to_string(b); while(tmp2.back()==' ') tmp2.pop_back(); if(tmp1.size()!=tmp2.size()) return false; int i=0,j=tmp1.size()-1; while(i<tmp1.size()) { if(tmp1[i]!=tmp2[j]) return false; i++,j--; } path.push_back(tmp1+' '+tmp2); return true; } int main() { int n=0; cin>>n; if(n<8712) { cout<<"0"<<endl; return 0; } int res=0; for(int i=2178;i<=n;++i) { if(4*i<=n &&check(i,4*i)) { res++; } } cout<<res<<endl; for(auto&s:path) cout<<s<<endl; return 0; }
这题是找规律题,其实很好推,分头想,如果要想满足逆序对,假设i为首个数则i*4<=9必须的 所以首只能是1-2同如果首是1那么尾部就是4,但是4*4=16无法往前推出1,所以只能是2,那么同理 可以推出尾部只能是8,一次可推出第二位一定是1倒数第二位一定是7,那么中间位一定是9,只要满足 情况小于n则一定是中间插入9即可,就是个数学找规律题 import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.*; public class Main { public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); StringBuilder s = new StringBuilder("2178"); LinkedHashMap<String,String> m = new LinkedHashMap<>(); while (n>=Integer.parseInt(new StringBuilder(s).reverse().toString())){ m.put(s.toString(),new StringBuilder(s).reverse().toString()); s.insert(2,"9"); } BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); bw.write(Integer.toString(m.size())); if(m.size()==0){ bw.flush();return; } bw.newLine(); for (String s1 : m.keySet()) { bw.write(s1+" "+m.get(s1)); bw.newLine(); } bw.flush(); } }
import java.util.*; public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); if(n < 8712) System.out.println(0); else{ if(n <= 10000){ System.out.println(1); System.out.println(2178 + " " + 8712); } else{ int index = 1; List<String> ans = new ArrayList<>(); ans.add("2178"); ans.add("8712"); //System.out.println(1); //System.out.println(2178 + " " + 8712); for(int i = 2501;i <= n / 4;i++){ String s1 = String.valueOf(i); String s2 = String.valueOf(i * 4); StringBuffer buffer = new StringBuffer(s1); String s3 = buffer.reverse().toString(); if(s3.equals(s2)){ index++; ans.add(s1); ans.add(s2); } } System.out.println(index); for(int i = 0;i < ans.size();i++){ System.out.print(Integer.valueOf(ans.get(i)) + " "); if(i % 2 == 1) System.out.println(); } } } } }
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main(){ long long x; cin>>x; vector<long long> vec; for(long long i=1;i<=x/4;i++){ string s1=to_string(i); string s2=to_string(4*i); reverse(s2.begin(),s2.end()); if(s1==s2){ vec.push_back(i); vec.push_back(4*i); } } if(vec.size()==0) cout<<0; else{ cout<<vec.size()/2<<endl; for(int i=0;i<vec.size();i+=2){ cout<<vec[i]<<" "<<vec[i+1]<<endl; } } }
import java.io.IOException; import java.util.Scanner; public class Main { public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); int num = sc.nextInt(); StringBuilder sb = new StringBuilder(); int res = 0; if(num>8711&&num<87912){ res=1; sb.append(2178 +" "+ 8712 + "\n"); } else if(num>87911 && num<879912){ res=2; sb.append(2178 +" "+ 8712 + "\n"); sb.append(21978 +" "+ 87912 + "\n"); } else if(num>879911 && num<8799912){ res=3; sb.append(2178 +" "+ 8712 + "\n"); sb.append(21978 +" "+ 87912 + "\n"); sb.append(219978 +" "+ 879912 + "\n"); } else if(num>8799911 && num<87999912){ res=4; sb.append(2178 +" "+ 8712 + "\n"); sb.append(21978 +" "+ 87912 + "\n"); sb.append(219978 +" "+ 879912 + "\n"); sb.append(2199978 +" "+ 8799912 + "\n"); } System.out.println(res); System.out.println(sb.toString()); } }
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; if (n < 2178) { cout << 0; return 0; } else if (n < 10001) { cout << 1 << '\n' << "2178 8712" << endl; return 0; } vector<pair<int, int>> res{{2178, 8712}}; for (int i = 10002; i <= n / 4; i += 4) { string a = to_string(i); string b = to_string(i * 4); reverse(a.begin(), a.end()); if (a == b) { res.push_back({i, i * 4}); } } int len = res.size(); cout << len << '\n'; //cout << 2178 << ' ' << 8712; for (int i = 0; i < len; ++i) { cout << res[i].first << ' ' << res[i].second << '\n'; } return 0; }